Script de fond

Nouveau WRInaute
Bonjour,

Je suis actuellement bloqué sur un problème.

Je souhaite faire appel a un script long en php qui se lance en tache de fond.

Pour l'heure j'ai un script ajax qui appel une page php (jusque là pas de problème).
Mon script s'éxécute une première fois et se que je voudrai c'est que tant que le traitement sur la base de donnée n'est pas terminé, il recommence.

Donc j'ai penser dans un premier temps faire un truc du genre :
Code:
<?php
	bla bla bla //mon traitement complet pour une ligne de ma base avec un tas de fonction lente pour arrangé le tout
	if(maListATraité=pas fini)
	{
		header('location:mapage.php');
	}
?>

Le traitement d'une ligne par appel de page est surtout parce que je suis limité à 30sec d'exécution et que 30sec correspond a environ 10 exécution complète. je suis mal barré pour mes 3000 restante.

donc si j'exécute la page toute seule via l'url elle marche nickel. mais moi je veux la lancé en tache de fond, et donc l'ajax ne me permet pas de rechargé la page ainsi.

Je me suis donc tournée vers du exec() mais je ne trouve pas vraiment comment le mettre en oeuvre.

afin de tester la fonction exec j'ai fait deux page .php et une .txt.

ma page .txt est en chmod 777
Ma page plump.php est celle que je lance via le navigateur :
Code:
<?php
	exec(getcwd().'test_mail/nours.php');
?>
Et ma page nours.php est celle appellez par exec() :
<
Code:
?php
	$fp=fopen('test.txt', "a+");
	fwrite($fp, "nounours\n");
	fclose($fp);
?>

Et là, c'est le drame, rien ne se passe.
Je suis sur serveur mutualisé d'ovh. mais mon code pourrai se retrouvé sur d'autre platforme...

Alors comment faire pour que sois mon code php de traitement boucle sur plus de 12h sans problème ou bien comment faire pour lancé ma page de script php via un autre script php le tout sans problème ?

J'ai regardé pour du cron, mais je n'ai pas trouvé d'explication simple pour le mettre en oeuvre via php sans intervention serveur.

Merci d'avance pour vos réponses.
 
WRInaute accro
Le Cron c'est juste un bête script php, qui est paramétré pour être lancé à intervalle définie au niveau du serveur. Mais tu peux aussi faire appel à un service externe pour programmer ton cron : http://webcron.org/
 
Nouveau WRInaute
Et sinon ? rien de gratuit ???
Enfin,si c'est si bête que ça, pourquoi je ne trouve pas d'explication aussi bête que lui-même???

En gros si je comprend bien, pour mon cas, il faudrait que je définisse au début l'appel serveur de mon script php, et à la fin je clôture mon appel ? ET comment le faire via php ?

Merci déjà pour les bribes de réponse.
 
WRInaute accro
Tu peux flaguer avec la date. Comme ça, à chaque passage tu checkes ce qui reste à faire (= ce qui n'a pas été traité pour la date en cours).

Et pour faire ça gratuit, bein c'est au niveau de ta conf serveur. A voir avec ton hébergeur si il propose quelque chose à ce niveau.
 
Nouveau WRInaute
Mais bon, sachant que c'est un script qui se verrai exécuter durant plusieurs heures, mais relativement ponctuellement, je ne vais pas créer un cron qui me lancerai le script continuellement.

Alors comment je peu simplement refreach ma page appelez par AJAX mais qui pourrai continué à tournée si le navigateur ou l'ordi plante ?
 
Nouveau WRInaute
J'ai regardé pour faire du shell_exec(),
Mais je n'arrive pas à le faire fonctionné.

J'ai donc testé en premier lieu :
Code:
$out = shell_exec("php -n -s ma_page.php");
Et je récupère dans mon $out l'intégralité de mon code php non exécuté.

Ensuite j'ai continué à potassé et j'ai eu :
Code:
$out=shell_exec("php ma_page.php");
à se moment là, j'ai ma page qui rame à mort et ça me fait planté le serveur, et je n'ai pas l'impression que cela fonctionne réellement.

afin de testé sur mon serveur wamp, je ne peu pas utilisé shell_exec (en tout cas j'ai modifier le php.ini et il ne tourne toujours pas) alors je m’oriente vers du exec().

Est-ce que quelqu'un à une idée de comment je peu appellé ma page de script php et qu'il soit exécuter comme tel et en plus en tache de fond (avec un & à la fin si j'ai bien comprit la plupart des explication)?

si j'ai bien compris, c'est un code du style :
Code:
exec("php path/to/ma/page/ma_page.php &");
Mais en mieux et qui fonctionne. Comment puis-je faire ?
 
Nouveau WRInaute
Finalement réussi :

Donc petit rappel :
J'ai ma première page on va la nommé index.php
Code:
<!--page index.php-->
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<script src="js/function.js"></script>
	</head>
	<body>
		<input type="button" value="Go" onclick="appel_ma_page(1);" />
	</body>
</html>

Quand je click sur mon bouton "Go" cela appel ma fonction appel_ma_page(var i) présent dans ma page nommé function.js

Code:
/**
* page fonction.js
**/
/** Fonction d'initialisation d'ajax **/
function getAjax()
{ 
	// initialise l'utilisation de l'ajax
	var Ajax = null;
	if(window.XMLHttpRequest) // Firefox et autres
	Ajax = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
	try {Ajax = new ActiveXObject("Msxml2.XMLHTTP");} 
	catch (e) {Ajax = new ActiveXObject("Microsoft.XMLHTTP");}
	} else { // XMLHttpRequest non supporté par le navigateur 
	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
	Ajax = false;
	} return Ajax;
}

function appel_ma_page(id)
{ 
	id=parseInt(id);
	var Ajax = getAjax();
	// On définit ce qu'on va faire quand on aura la réponse
	Ajax.onreadystatechange = function(){
		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
		// vous pouvez toujours récupérer s'il y a quelque chose à récupéré de votre page.php avec 
		/*if(Ajax.readyState == 4 && Ajax.status == 200){alert(Ajax.responseText);}*/
	}
	// poste la page
	Ajax.open("POST","traitement.php",false);//appel de la page traitement.php en méthode post et de manière asynchrone
	// ne pas oublier ça pour le post
	Ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	Ajax.send('id='+id);
}

A partir de là, votre page traitement.php tourne de manière asynchrone mais toujours en front et non pas en tache de fond.
Une première exécution du code s'effectue en front mais se n'est pas si grave d'attendre 2 seconde comparé aux heures économisés.

Code:
<?
	$tempo=2;//temps entre deux envois d'@mail en secondes.
	//je récupère ma variable passé en post et je l'enregistre dans un document .txt(list_var.txt en chmod 777)
	if(isset($_POST['id']) && $_POST['id']!="")
	{
		$fp=fopen(getcwd().'/list_var.txt', "a+");//j'ouvre le document
		fwrite($fp, protect($_POST['id'])."\n");// j'insère sur la ligne suivante ma variable que je protège avec une fonction perso
		fclose($fp);//je ferme le document.
	}
	
	$donnee = file(getcwd()."/list_var.txt");
	$id=$donnee[0];
	// je récupère mon id pour mon traitement de quelqu'ordre qu'il soit (modification sur base de donnée, etc.)
	
	bla bla bla //tout mon traitement php que j'ai à faire.

	function nextaction()
	{
		if(!test_si_jai_fini)
		{
			//si non (je n'ai pas fini)
			exec('/usr/local/bin/php '.getcwd().'/traitement.php > /dev/null &');
			//exectution en tache de fond de mon script traitement.php
		}
		else
		{
			//si oui (victoire !!!)
			$donnee = file(getcwd()."/list_var.txt");
			//j'efface la variable de la première ligne et je test s'il y en a d'autre.
			$fichier=fopen(getcwd().'/list_var.txt', "w");
			fputs($fichier, '');
			$i=0;
			foreach($donnee as $d)
			{
				if($i!=0)
				{
					fwrite($fichier, $d);
				}
				$i++;
			}
			fclose($fichier);
			if(count($donnee>1))
			{
				//Si il y a une autre ligne de variable (je m'en sert un peu comme une liste de chose à faire
				exec('/usr/local/bin/php '.getcwd().'/traitement.php > /dev/null &');
				//cela va relancé le traitement pour la seconde ligne de traitement.
			}
		}
	}
?>

En espérant que cela va servir à d'autre.

Merci pour vos réponses et à bientôt.
 
Discussions similaires
Haut