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

问题描述 投票:0回答:3

我看到了有关该问题的其他几个问题,但没有明确的答案。

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

doWork($param1);

doWork($param2);

doWork($param2);

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

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

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

有什么想法吗?

php concurrency
3个回答
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
}

有关 argv 的更多信息


1
投票

添加怎么样

"> /dev/null 2>/dev/null &"

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

您可以查看文档了解更多


0
投票

您可以将所有 PHP 放入同一个主文件中,并使用参数回调它。

工作流程 提示> php main.php开始运行,那么你想要一个叫非阻塞的函数 Main.php 通过 exec 调用自身,只不过现在它有一个参数。 exec("nohup php main.php -f 函数函数参数 &"). 在 main.php 中,您有一个 argv 处理程序,它将所有内容组合在一起并运行您想要的函数。 如果没有返回数据,则完成。 如果您有返回数据,请将其发送到文件。 您也可以将其设为参数。

© www.soinside.com 2019 - 2024. All rights reserved.