【问题标题】:How can I spawn concurrent processes with PHP?如何使用 PHP 生成并发进程?
【发布时间】:2010-08-20 13:21:21
【问题描述】:

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

【问题讨论】:

    标签: php proc-open


    【解决方案1】:

    其他人正在指出替代方案,但您的实际问题可能是您的 $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 在你做完你需要做的任何事情之后(即:读取管道等)。如果您真正想要的是启动它们并忘记它们,那是另一种解决方案。

    【讨论】:

    • 已修复。如果记录在案就好了。
    • WTF?!为什么 PHP 手册中没有告诉我们这一点?我对这个问题进行了几个小时的调查,然后发现 proc_open(明确建议对自定义 proc 进行更多“高级控制”)是无用的。
    【解决方案2】:

    【讨论】:

    • 具体是哪个函数? pcntl_exec 看起来是唯一产生某些东西的,它会停止当前进程。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        试试这个:

        $cmdline = "sleep 5 &";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-10
          • 2013-10-28
          • 2011-04-10
          • 2016-02-11
          相关资源
          最近更新 更多