2015-07-29 2 views
1

J'utilise le code suivant pour ouvrir un processus avec proc_open et pour sauver la poignée et les tuyaux d'un fichier:Php proc_open - sauver poignée de processus dans un fichier et le récupérer

$command = "COMMAND_TO_EXECUTE"; 

    $descriptors = array(
     0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
     1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
     2 => array("file", "error-output.txt", "a") // stderr is a file to write to 
    ); 


    $pipes = array(); 

    $processHandle = proc_open($command, $descriptors, $pipes); 

    if (is_resource($processHandle)) {  

     $processToSave = array(
      "process" => $processHandle, 
      "pipes" => $pipes 
     ); 

     file_put_contents("myfile.bin", serialize($processToSave));   

    } 

Et dans une seconde moment, je dois récupérer ce descripteur de fichier à partir du fichier, je l'ai utilisé ce code:

$processArray = unserialize(file_get_contents("myfile.bin")); 
$processHandle = $processArray["process"]; 
$pipes = $processArray["pipes"]; 

Mais quand j'imprimer une var_dump de ProcessHandle $ et tuyaux $ après avoir récupéré à partir du fichier, je vais obtenir des entiers au lieu de ressource ou processus, mais pourquoi?

var_dump($processHandle) -> int(0) 
var_dump($pipes) - > array(2) { int(0), int(0) } 

Et à ce moment bien sûr, si je tente de fermer les tuyaux, je vais obtenir une erreur, ressource attendue, entier donné.

Comment puis-je faire fonctionner cela? (NOTE: C'est la solution que je cherche)

Mais en variante, je peux aussi obtenir le pid de processus et ensuite utiliser ce pid pour arrêter ou tuer ou faire autre chose avec le processus, mais qu'en est-il des tuyaux? ? Comment puis-je lire/écrire ou enregistrer des erreurs de/vers le processus?

Merci

Répondre

1

trouvé la solution à moi-même, il est possible de ne pas sérialiser ressources et lorsque le script a fait, les gestionnaire de ressources étaient libres.

La solution était de créer un démon écoutant sur un port, qui à la demande lancer et arrêter le processus. Étant donné que le processus est toujours en cours d'exécution, il peut gérer une liste de processus de gestionnaire et arrêter à la demande.