PHP:如何将信息返回到等待的脚本并继续处理
假设有两个脚本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或者使用套接字更新请求者?