6

我正在尝试使用 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";
}
4

5 回答 5

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在你做完这些你需要做的任何事情后使用(即:读取管道等)。如果您真正想要的是启动它们并忘记它们,那是一个不同的解决方案。

于 2010-08-20T13:33:48.813 回答
0

看到这个: http ://www.php.net/manual/en/book.pcntl.php

于 2010-08-20T13:23:28.310 回答
0

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

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

于 2010-08-20T13:32:16.247 回答
0

我认为这是“proc_open”的设计方式(实际上是系统)。你需要指定你想用 & 断开连接,或者通过实际运行一个 shell 脚本来运行子程序并返回给你。

于 2010-08-20T13:34:28.330 回答
0

尝试这个:

$cmdline = "sleep 5 &";
于 2010-08-20T13:31:24.017 回答