PHP: 如何以非阻塞方式调用函数?
PHP: how can I call a function in a non-blocking fashion?
我看到了关于这个问题的其他几个问题,但没有明确的答案。
我有一个来自 CLI 的 PHP 文件(必须是 PHP,不能是 cron 或其他东西)运行,我必须用不同的参数多次调用同一个函数:
doWork($param1);
doWork($param2);
doWork($param2);
function doWork($data)
{
//do stuff, write result to db
}
每次调用都会发出 HTTP 请求并解析响应。该操作最多可能需要一分钟才能完成。我必须防止 "convoy effect":每个调用都必须在不等待前一个调用完成的情况下执行。
由于服务器限制,PECL pthread 不是一个选项。
有什么想法吗?
加"> /dev/null 2>/dev/null &"
如何
exec('php myFile.php > /dev/null 2>/dev/null &');
您可以check the documentation获得更多
据我所知,您做不到您想要的。
您必须以非阻塞方式调用另一个 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
}
我看到了关于这个问题的其他几个问题,但没有明确的答案。
我有一个来自 CLI 的 PHP 文件(必须是 PHP,不能是 cron 或其他东西)运行,我必须用不同的参数多次调用同一个函数:
doWork($param1);
doWork($param2);
doWork($param2);
function doWork($data)
{
//do stuff, write result to db
}
每次调用都会发出 HTTP 请求并解析响应。该操作最多可能需要一分钟才能完成。我必须防止 "convoy effect":每个调用都必须在不等待前一个调用完成的情况下执行。
由于服务器限制,PECL pthread 不是一个选项。
有什么想法吗?
加"> /dev/null 2>/dev/null &"
如何
exec('php myFile.php > /dev/null 2>/dev/null &');
您可以check the documentation获得更多
据我所知,您做不到您想要的。
您必须以非阻塞方式调用另一个 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
}