我看到了有关该问题的其他几个问题,但没有明确的答案。
我有一个从 CLI 运行的 PHP 文件(必须是 PHP,不能是 cron 或其他东西),我必须使用不同的参数多次调用同一个函数:
doWork($param1);
doWork($param2);
doWork($param2);
function doWork($data)
{
//do stuff, write result to db
}
每次调用都会发出 HTTPs 请求并解析响应。该操作最多可能需要一分钟才能完成。我必须防止“护航效应”:每个调用都必须执行而无需等待前一个调用完成。
由于服务器限制,PECL pthread 不是一个选项。
有什么想法吗?
据我所知,您无法做您正在寻找的事情。
您必须以非阻塞方式调用另一个 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
}
您可以将所有 PHP 放入同一个主文件中,并使用参数回调它。
工作流程 提示> php main.php开始运行,那么你想要一个叫非阻塞的函数 Main.php 通过 exec 调用自身,只不过现在它有一个参数。 exec("nohup php main.php -f 函数函数参数 &"). 在 main.php 中,您有一个 argv 处理程序,它将所有内容组合在一起并运行您想要的函数。 如果没有返回数据,则完成。 如果您有返回数据,请将其发送到文件。 您也可以将其设为参数。