proc_open : arreter le processus avant la fin du script php

proc_open : arreter le processus avant la fin du script php - PHP - Programmation

Marsh Posté le 19-03-2007 à 20:06:24    

Bonjour,
 
j'execute via la fonction proc_open des processus qui durent, qui durent...
seulement voila, a la fin du script php (ou si le client coupe la connexion avant), le processus continue a tourner... et ca c'est pas glop :/
 
Bref, existe il un moyen de dire au script php d'arreter le processus a la fin de celui ci ou si le client web se deconnecte ?

Reply

Marsh Posté le 19-03-2007 à 20:06:24   

Reply

Marsh Posté le 19-03-2007 à 23:17:54    

j'ai essayé de faire ceci, mais sans resultat :(
 

Code :
  1. ignore_user_abort(true);
  2. $cmd = 'ping -t google.fr';
  3. $descriptorspec = array(
  4.         0 => array("pipe", "r" ),  // stdin
  5.         1 => array("pipe", "w" ),  // stdout
  6.         2 => array("file", "error-output.txt", "a" ) // stderr
  7. );
  8. $process = proc_open($cmd, $descriptorspec, $pipes, getcwd());
  9. if (!is_resource($process))
  10. {
  11.         return;
  12. }
  13. fclose($pipes[0]);
  14. while (!feof($pipes[1]))
  15. {
  16.         $buff = fread($pipes[1], 16384);
  17.         echo $buff;
  18.         flush();
  19.         if (connection_status() != 0)
  20.         {
  21.                 do
  22.                 {
  23.                         $state = proc_get_status($process);
  24.                         proc_terminate($process);
  25.                 }
  26.                 while($state['running']);
  27.                 break;
  28.         }
  29.        
  30. }
  31. fclose($pipes[1]);
  32. $return_value = proc_close($process);

Reply

Marsh Posté le 20-03-2007 à 10:50:23    

Bon, j'ai trouve alors je post la reponse, ca peut servir a d'autres.
Avant tout, ca ne fonctionne que sur PHP 5.2.1 et superieur.
 

Code :
  1. <?php
  2. ignore_user_abort(true);
  3. $cmd = 'ping -t google.fr';
  4. $descriptorspec = array(
  5.  0 => array("pipe", "r" ),  // stdin
  6.  1 => array("pipe", "w" ),  // stdout
  7.  2 => array("file", "error-output.txt", "a" ) // stderr
  8. );
  9. $process = proc_open($cmd, $descriptorspec, $pipes, getcwd(), null, array('bypass_shell' => true));
  10. if (!is_resource($process))
  11. {
  12.  return;
  13. }
  14. fclose($pipes[0]);
  15. while (!feof($pipes[1]))
  16. {
  17.  $buff = fread($pipes[1], 16384);
  18.  echo $buff;
  19.  flush();
  20.  if (Connection_Aborted())
  21.  {
  22.    do
  23.    {
  24.      $state = proc_get_status($process);
  25.      proc_terminate($process);
  26.      fclose($pipes[1]);
  27.      $return_value = proc_close($process);
  28.    }
  29.    while($state['running']);
  30.    exit (0);
  31.  }
  32. }
  33. ?>

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed