2010-08-20 9 views
6

J'essaye d'engendrer plusieurs processus à la fois en PHP avec proc_open, mais le second appel ne commencera pas avant la fin du premier processus. Voici le code que je utilise:Comment générer des processus concurrents avec PHP?

for ($i = 0; $i < 2; $i++) 
{ 
    $cmdline = "sleep 5"; 
    print $cmdline . "\n"; 
    $descriptors = array(0 => array('file', '/dev/null', 'r'), 
         1 => array('file', '/dev/null', 'w'), 
         2 => array('file', '/dev/null', 'w')); 
    $proc = proc_open($cmdline, $descriptors, $pipes); 
    print "opened\n"; 
} 

Répondre

6

D'autres font remarquer des alternatives, mais votre problème réel est probablement la fuite de votre variable $ proc. Je crois que PHP doit garder une trace de cela et si vous écrasez, il va nettoyer pour vous (ce qui signifie proc_close, ce qui signifie qu'il faut attendre ...)

Essayez ne fuit pas la valeur proc $:

<?php 
$procs = array(); 
for ($i = 0; $i < 2; $i++) 
{ 
    $cmdline = "sleep 5"; 
    print $cmdline . "\n"; 
    $descriptors = array(0 => array('file', '/dev/null', 'r'), 
    1 => array('file', '/dev/null', 'w'), 
    2 => array('file', '/dev/null', 'w')); 
    $procs[]= proc_open($cmdline, $descriptors, $pipes); 
    print "opened\n"; 
} 
?> 

Remarque: Cela nettoiera vos poignées de processus avant de quitter, de sorte que tous les processus devront être terminés en premier. Vous devriez utiliser proc_close une fois que vous avez fini de faire ce que vous avez besoin de faire avec ceux-ci (par exemple: lire des tuyaux, etc). Si ce que vous voulez vraiment, c'est les lancer et les oublier, c'est une solution différente.

+0

L'a corrigé. Ce serait bien si cela était documenté. –

+0

WTF ?! Pourquoi cela ne nous est-il pas dit dans le manuel de PHP? J'ai enquêté sur ce problème pendant des heures et puis il est sorti que proc_open (ce qui est explicitement suggéré pour plus de "contrôle avancé" sur les procs personnalisés) est inutile. – kishkash

0
+0

Qui fonctionnent spécifiquement? pcntl_exec ressemble à la seule qui engendre quelque chose, et il arrête le processus en cours. –

+0

pcntl_fork() (ne fonctionnant pas sur win32 php) –

0

Essayez ceci:

$cmdline = "sleep 5 &"; 
0

Je pense que c'est comme ça que "proc_open" est conçu pour fonctionner (en fait le système). Vous devez spécifier que vous voulez vous déconnecter avec & ou en exécutant un script shell qui exécutera le sous-programme et vous reviendra.

Questions connexes