proc_open et set_time_limit

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : proc_open et set_time_limit

par titerm » 22 mars 2007, 01:03

En théorie, si tu flush, c'est que tu as fais un ob_start, hors il sont tout a fait imbricable, il suffit donc que tu en lance un au tout début avec la fonction de callback, de tel sorte qu'a la fin du script, ce soit php qui appel automatiquement le flush et donc la fonction de callback.

par psykokwak » 21 mars 2007, 22:20

ob_start() ne me convient pas. je flush ma sortie apres chaque lecture sur mon stream.

par psykokwak » 21 mars 2007, 22:15

Je suppose que tu parle de register_shutdown_function(). mais dapres la doc php. cette fonction est appelé lors de l'extinction du script suivant l'execution du script interrompu. hors si le script precedent est interrompu, le suivant le sera aussi...

j'ai essayé avec de gerer mon stream avec stream_select() mais il semblerait que la fonction bug a mort avec proc_open sur windows :/

par titerm » 21 mars 2007, 20:06

tu peux toujours essayer de faire un ob_start('finishThem') avec une fonction de callback qui termine les processus ouvert...

tu stockes tout les pid de tes process dans un tableau global $aPID
et dans ta fonction de callback qq chose du genre
function finishThem($buf) {
global $aPID;
foreach($aPID as $pid)  {
proc_terminate($pid);
}
return $buf;
}

proc_open et set_time_limit

par psykokwak » 21 mars 2007, 18:34

J'en appelle aux pros de PHP.
j'execute via la fonction proc_open des processus qui durent, qui durent...
La doc de PHP dit sur la fonction set_time_limit qu'elle ne tient pas compte du temps ou PHP s'occupe de la gestion des flux de donnees.
connection_status() indique quand le client a abandonne la connexion ou quand le script arrive en timeout.
Donc logiquement, quand le script arrive en timeout (30 sec par defaut), je devrais killer mon process et arreter le script.
Hors il semblerait qu'il y ait un probleme (un bug?) faisant qu'au moment ou le script par en timeout, le process executé ne passe plus la main (il se met donc a tourner a l'infini) et le serveur ne ferme pas la connexion HTTP.
La solution est de mettre un set_time_limit(0) qui empechera le script de partir en timeout. Seulement si la liaison reseau entre le client et le serveur est rompu (sans deconnexion du client), le script attends normalement la fin de son execution (ou son timeout) avant d'arreter son process fils et de s'arreter lui meme.


Bref, je cherche un moyen d'arreter mon process au timeout du script PHP...
(ne fonctionne qu'avec php5.2.1 ou php6)
<?php

ignore_user_abort(true);

$cmd = 'ping -t google.fr';

$descriptorspec = array(
		0 => array("pipe", "r"),  // stdin
		1 => array("pipe", "w"),  // stdout
		2 => array("file", "error-output.txt", "a") // stderr
);

$process = proc_open($cmd, $descriptorspec, $pipes, getcwd(), null, array('bypass_shell' => true));

if (!is_resource($process))
{
		return;
}
fclose($pipes[0]);

while (!feof($pipes[1]))
{
		$buff = fread($pipes[1], 16384);

		echo $buff;
		flush();
		if (connection_status()!=0)
		{
				do
				{
						$state = proc_get_status($process);
						proc_terminate($process);
						fclose($pipes[1]);
						$return_value = proc_close($process);
				}
				while($state['running']);
				exit (0);
		}
}
?>