Как я могу создавать параллельные процессы с помощью 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";
}
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
после того, как закончите делать все, что вам нужно сделать с этим (т.Е.: читать каналы и т. Д.). Если вы действительно хотите запустить их и забыть о них, это другое решение.
Смотрите это: http://www.php.net/manual/en/book.pcntl.php
Вот отличная небольшая статья о создании потоков. Он включает в себя класс и то, как его использовать. http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html
Это должно помочь вам двигаться в правильном направлении.
Я думаю, что это способ, которым "proc_open" предназначен для работы (на самом деле система). Вам нужно указать, что вы хотите отключиться с помощью & или, фактически запустив сценарий оболочки, который запустит подпрограмму и вернется к вам.
Попробуйте это:
$cmdline = "sleep 5 &";