簡體   English   中英

如何使用PHP生成並發進程?

[英]How can I spawn concurrent processes with PHP?

我正在嘗試使用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 如果您真正想要的是啟動它們而忘記它們,那就是另一種解決方案。

試試這個:

$cmdline = "sleep 5 &";

這是一篇關於創建線程的小文章。 它包括一個類以及如何使用它。 http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html

這應該讓你朝着正確的方向前進。

我認為這是“proc_open”的設計方式(實際上是系統)。 您需要指定要與之斷開連接,或者通過實際運行將運行子程序並返回給您的shell腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM