Как я могу создавать параллельные процессы с помощью PHP?


Я пытаюсь запустить несколько процессов одновременно в 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";
}
Author: Dan Goldstein, 2010-08-20

5 answers

Другие указывают на альтернативы, но ваша реальная проблема, скорее всего, заключается в утечке вашей переменной $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 после того, как закончите делать все, что вам нужно сделать с этим (т.Е.: читать каналы и т. Д.). Если вы действительно хотите запустить их и забыть о них, это другое решение.

 6
Author: Brandon Horsley, 2010-08-20 13:39:08
 0
Author: Piotr Müller, 2010-08-20 13:23:28

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

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

 0
Author: Chuck Burgess, 2010-08-20 13:32:16

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

 0
Author: greg, 2010-08-20 13:34:28

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

$cmdline = "sleep 5 &";
 0
Author: Matthew, 2012-08-21 08:51:52