2010-08-20 13 views
6

Sto provando a generare più processi contemporaneamente in PHP con proc_open, ma la seconda chiamata non verrà avviata fino alla fine del primo processo. Ecco il codice che sto usando:Come posso generare processi concomitanti con 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"; 
} 

risposta

6

Altri indicano le alternative, ma il problema reale è probabilmente la perdita della variabile $ proc. Credo che PHP ha per tenere traccia di questo e se si sta sovrascrivendo, esso pulirà per voi (che significa proc_close, il che significa che in attesa ...)

Prova che non perda il valore 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"; 
} 
?> 

Nota: questo pulirà ancora i manici di processo prima di uscire, quindi tutti i processi dovranno essere completati per primi. Dovresti usare proc_close dopo aver finito di fare tutto ciò che devi fare con questi (es: leggi pipe, ecc.). Se quello che vuoi veramente è lanciarli e dimenticarli, questa è una soluzione diversa.

+0

risolto. Sarebbe bello se questo fosse documentato. –

+0

WTF ?! Perché questo non ci è stato detto nel manuale PHP? Stavo indagando su questo problema per ore e poi è venuto fuori che proc_open (ciò che è esplicitamente suggerito per un maggiore "controllo avanzato" rispetto ai proc personalizzati) è inutile. – kishkash

0
+0

Quale funzione in particolare? pcntl_exec sembra l'unico che genera qualcosa e interrompe il processo corrente. –

+0

pcntl_fork() (non funziona su Win32 php) –

0

Prova questa:

$cmdline = "sleep 5 &"; 
0

Penso che il modo in cui "proc_open" sia design per funzionare (in realtà il sistema). È necessario specificare di voler disconnettere con & o eseguendo effettivamente uno script di shell che eseguirà il sottoprogramma e ritornerà a voi.

Problemi correlati