8791 sujets

Développement web côté serveur, CMS

Hello,

Petite interrogation...
Qu'est-ce qu'il se passe si je lance un script PHP et que je ferme ma fenetre avant la fin du traitement ? J'imaginais que le script s'arretait en cours de route, mais il semblerait qu'il continue de s'exécuter jusqu'à atteindre le MAX_EXECUTION_TIME. Quelqu'un peut confirmer ?

Je suis en train de simuler un Cron Unix en php, avec un script qui tournerait en boucle et qui gérerait donc des taches planifiées.
Pour ça j'ai donc enlevé la limite de temps avec set_time_limit(0) et ait ensuite fait une boucle while (true) qui contient un sleep(), de façon a répéter toujours la même opération à intervalles réguliers...

Bien sur, j'ai beau n'en être que début du projet, j'ai mis un système pour éviter que plusieurs Cron ne se lancent en même temps, mais ça n'empeche que je viens de me faire trés trés peur... sachant que j'avais beau arreter mon script en fermant mon navigateur, il continuait de tourner en arriere plan indéfiniment...

Voici un le bout de code qui fait bobo si on le laisse faire :


set_time_limit(0);
//Boucle à priori sans fin
while (true) {
	//On créé un fichier
	$file = fopen(mktime().".txt", "w");
	fclose($file);		
		
	//On se laisse une porte de sortie pour arreter le script s'il s'emballe trop quand même
	if (file_exists("stop.txt")) die();
}


Le seul moyen d'arreter cette boucle est donc de rajouter un fichier stop.txt dans le même dossier...
Bref, à moins d'avoir prévu à l'avance le moyen d'arreter la boucle folle ou de couper le serveur j'ai pas trouvé d'autre moyen d'arreter le script.

Si quelqu'un pouvait me reprendre et me dire que je dis de grosses grosses bétises, ça m'arrangerait, sinon ça risque d'être dangereux comme script Smiley lol
Modifié par Tymlis (11 Oct 2007 - 18:50)
ignore_user_abort est par défaut sur false, ce qui signifie que le script doit s'arreter en cas de fermeture de page, or ça n'a pas l'air d'être vraiment le cas.
J'ai explicitement indiqué ignore_user_abort(false) mais cela ne semble pas avoir d'effet sur ma boucle, fermer la fenetre du navigateur continue l'execution infinie du script en arrière plan.

Les commentaires du lien que tu me donnes me donne une piste :
a écrit :
PHP only senses user aborts when a script sends output. If there's no output sent to the client before processing completes, [...], the script will run to completion.


Cela dit ça m'avance pas beaucoup, j'ai beau rajouter des echos, couper le script en cours d'execution ne l'arrete toujours pas.
A ce moment peut-être regarder du côté de la fonction flush().

A noter aussi que la fonction sleep() pourrait rendre le script plus léger (à vérifier je ne sais pas comment est gérer cette fonction en interne).
J'ai testé des trucs avec flush() aussi, histoire de forcer un output, et connection_status(), connection_aborted(), mais j'ai jamais réussi à attraper la fermeture de la page...

sleep() ayant des comportements différents selon si le script tourne sous Windows ou Unix (prise en compte du temps dans le MAX_EXECUTION_TIME ou non) j'ai pas trop trop testé...

Je pars sur une autre piste pour le moment, en restant sur la seule façon que j'ai trouvé d'arreter le script, grace à une condition dans le while(true)