PHP:如何将信息返回到等待的脚本并继续处理

时间:2020-03-06 14:37:02  来源:igfitidea点击:

假设有两个脚本Requester.php和Provider.php,并且Requester需要从Provider处理并向其发出http请求(Provider.php?data =" data")。在这种情况下,Provider会快速找到答案,但是要维持系统必须在整个数据库中执行各种更新。有没有一种方法可以立即将值返回给Requester,然后继续在Provider中进行处理。

伪代码

Provider.php 
{
   $answer = getAnswer($_GET['data']);
   echo $answer;
   //SIGNAL TO REQUESTER THAT WE ARE FINISHED
   processDBUpdates();
   return;
}

解决方案

我们可以使用flush()命令刷新输出缓冲区。
阅读PHP手册中的注释以获取更多信息

将提供者分为两个部分:" ProviderCore"和" ProviderInterface"。在ProviderInterface中,只需做"快速而简单"的部分,还可以在数据库中保存一个标志,表明尚未处理最近的请求。将ProviderCore作为cron作业运行,以搜索该标志并完成处理。如果无事可做,ProviderCore将终止并在(例如)2分钟内重试。

我认为我们需要在提供程序上发送数据(一定要刷新),然后在请求程序上使用fopen / fread读取所需的数据量,以便可以断开与提供程序的连接并继续。如果我们没有指定期望的数据量,我认为请求者会坐在那里等待Provider关闭连接,直到连接运行结束(即所有次要工作都非常密集),这种情况才可能发生任务已完成)。我们需要尝试一些POC。

祝你好运。

我使用此代码在后台运行进程(适用于Linux)。

该过程运行,其输出重定向到文件。

这样,如果我需要显示进程的状态,只需编写少量代码即可读取和显示输出文件的内容。

我喜欢这种方法,因为它意味着我们可以完全关闭浏览器并稍后轻松返回以检查状态。

我们基本上想发出1进程结束的信号(返回到原始的Requester.php),并产生一个新进程(完成Provider.php)。可能有一种更优雅的方法可以实现这一目标,但是我已经通过几种不同的方式进行了管理。所有这些基本上都导致执行命令以终止第二个进程。

在命令末尾添加以下> / dev / null 2>&1&将允许它在后台运行,而不会阻止当前脚本的实际执行

类似以下内容可能适用于我们:

exec("wget -O - \"$url\" > /dev/null 2>&1 &");

-尽管我们也可以将其作为命令行PHP进程来执行。

我们还可以保存需要处理的信息,并在cron作业上处理剩余的处理,该作业可以重新创建相同类型的功能,而无需执行。

我要出门了,但是也许我们应该尝试使用cURL或者使用套接字更新请求者?