我正在尝试使用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";
}
有帮助吗?

解决方案

其他人则指出替代方案,但是您的实际问题可能是$ 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.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html

那应该使您朝着正确的方向前进。

我认为这是“ proc_open”的方式(实际上是系统)。您需要指定要与&或或实际运行将运行子程序并返回给您的Shell脚本的&或通过&或或通过&或或进行断开。

试试这个:

$cmdline = "sleep 5 &";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top