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";
}
È stato utile?

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 : 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

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 &";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top