PHP:如何以非阻塞方式调用函数?

时间:2015-01-19 11:51:57

标签: php concurrency

我在这个问题上看到了另外几个问题,但没有一个明确的答案。

我有一个从CLI运行的PHP文件(必须是PHP,不能是cron或其他东西),我必须使用不同的参数多次调用同一个函数:

doWork($param1);

doWork($param2);

doWork($param2);

function doWork($data)
{
//do stuff, write result to db
}

每次调用都会发出HTTP请求并解析响应。该操作可能需要长达一分钟才能完成。我必须防止“护送效果”:必须执行每个调用而不等待前一个调用完成。

由于服务器限制,PECL pthread不是一个选项。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如何添加"> /dev/null 2>/dev/null &"

exec('php myFile.php  > /dev/null 2>/dev/null &');

您可以check the documentation了解更多

答案 1 :(得分:1)

据我所知,你不能做你想要的。

您不必使用其参数调用函数,而是必须以非阻塞方式调用另一个cli php脚本,并将您的函数放入该脚本中。

这是你的主要剧本:

callDoWork($param1);
callDoWork($param2);
callDoWork($param3);

function callDoWork($param){
    $cmd = 'start "" /b php doWork.php '.$param;
    //if $param contains spaces or other special caracters for the command line,
    // you have to escape them.
    pclose(popen($cmd);
}

doWork.php看起来像:

if(is_array($_SERVER['argv'])) $param = $_SERVER['argv'][1];
doWork($param);
function doWork($data)
{
    //do stuff, write result to db
}

More information about argv