Как я могу порождать параллельные процессы с PHP? - PullRequest
6 голосов
/ 20 августа 2010

Я пытаюсь порождать несколько процессов одновременно в PHP с помощью proc_open, но второй вызов не начнется, пока не завершится первый процесс. Вот код, который я использую:

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";
}

Ответы [ 5 ]

6 голосов
/ 20 августа 2010

Другие указывают на альтернативы, но ваша настоящая проблема, вероятно, утечка вашей переменной $ proc. Я полагаю, что PHP должен отслеживать это, и если вы перезаписываете его, он очистит вас (что означает proc_close, что означает ожидание ...)

Старайтесь не пропускать значение $ 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";
}
?>

Примечание : Это все равно очистит ваши дескрипторы процесса перед выходом, поэтому все процессы должны будут завершиться в первую очередь. Вы должны использовать proc_close после того, как вы закончите делать то, что вам нужно сделать с ними (то есть: читать каналы и т. Д.). Если вы действительно хотите запустить их и забыть о них, это другое решение.

0 голосов
/ 20 августа 2010

Я думаю, что «proc_open» - это дизайн для работы (на самом деле система).Вы должны указать, что хотите отключиться от & или, фактически запустив сценарий оболочки, который запустит подпрограмму и вернется к вам.

0 голосов
/ 20 августа 2010

Попробуйте это:

$cmdline = "sleep 5 &";
0 голосов
/ 20 августа 2010

Вот отличная небольшая статья о создании тем.Он включает в себя класс и как его использовать.http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html

Это должно заставить вас двигаться в правильном направлении.

0 голосов
/ 20 августа 2010
...