如何使用PHP生成并发进程?

时间:2010-08-20 13:21:21

标签: php proc-open

我正在尝试使用proc_open在PHP中一次生成多个进程,但第二个调用将在第一个进程结束后才会启动。这是我正在使用的代码:

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 个答案:

答案 0 :(得分:6)

其他人指出了替代方案,但实际问题可能是你的$ 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。如果您真正想要的是启动它们而忘记它们,那就是另一种解决方案。

答案 1 :(得分:0)

答案 2 :(得分:0)

试试这个:

$cmdline = "sleep 5 &";

答案 3 :(得分:0)

这是一篇关于创建线程的小文章。它包括一个类以及如何使用它。 http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html

这应该让你朝着正确的方向前进。

答案 4 :(得分:0)

我认为“proc_open”是设计工作(实际上是系统)。您需要指定要与&amp;断开连接。或者通过实际运行一个shell脚本来运行子程序并返回给你。