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);
}
}
?>