代码之家  ›  专栏  ›  技术社区  ›  Dan Goldstein

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

  •  6
  • Dan Goldstein  · 技术社区  · 14 年前

    我试图在PHP中同时生成多个进程,proc\u是打开的,但是第二个调用在第一个进程结束之前不会启动。下面是我使用的代码:

    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 回复  |  直到 14 年前
        1
  •  6
  •   Brandon Horsley    14 年前

    其他人指出了替代方案,但实际问题可能是$proc变量泄漏。我相信PHP必须跟踪这一点,如果您正在覆盖它,它将为您清理(这意味着proc\u 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 当你做了任何你需要做的事情(例如:阅读管道等)。如果您真正想要的是启动它们并忘记它们,那是另一种解决方案。

        2
  •  0
  •   Piotr Müller    14 年前
        3
  •  0
  •   Chuck Burgess    14 年前

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

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

        4
  •  0
  •   greg    14 年前

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

        5
  •  0
  •   Rostyslav Dzinko Ankit    12 年前

    试试这个:

    $cmdline = "sleep 5 &";
    
    推荐文章