Come faccio a generare processi concorrenti con PHP?
Domanda
Sto cercando di più processi di spawn in una sola volta in PHP con proc_open, ma la seconda chiamata non partirà fino a quando il primo processo è terminato. Ecco il codice che sto usando:
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";
}
Soluzione
Altri stanno facendo notare alternative, ma il problema reale è probabilmente la fuoriuscita 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 aspettano ...)
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 ??strong>: Questo sarà ancora ripulire i manici di processo prima di uscire, quindi tutti i processi dovranno completare prima. Si dovrebbe usare proc_close
dopo aver terminato di fare tutto quello che devi fare con questi (ad esempio: tubazioni leggere, ecc). Se ciò che si vuole veramente è quello di lanciare loro e dimenticarsi di loro, che è una soluzione diversa.
Altri suggerimenti
Vedere questo: http://www.php.net/manual/en/book.pcntl. php
Ecco un articolo grande po 'di creare discussioni. Esso comprende una classe e come usarlo. http://www.alternateinterior.com/2007/ 05 / multi-threading-strategie-in-php.html
Questo dovrebbe farti andare nella giusta direzione.
Credo che sia così "proc_open" è stato progettato per il lavoro (in realtà il sistema). È necessario specificare che si desidera disconnettere con & o effettivamente in esecuzione uno script di shell che verrà eseguito il sottoprogramma e ritorno a voi.
Prova questo:
$cmdline = "sleep 5 &";