假设存在两个脚本Requester.php和Provider.php,并且Requester需要从Provider处理并向其发出http请求(Provider.php?data =“data”)。在这种情况下,Provider快速找到答案,但维护系统必须在整个数据库中执行各种更新。有没有办法立即将值返回给Requester,然后继续在Provider中处理。
Psuedo Code
Provider.php
{
$answer = getAnswer($_GET['data']);
echo $answer;
//SIGNAL TO REQUESTER THAT WE ARE FINISHED
processDBUpdates();
return;
}
答案 0 :(得分:2)
您可以使用flush()命令刷新输出缓冲区 阅读PHP manual中的评论以获取更多信息
答案 1 :(得分:2)
我使用this code在后台运行进程(适用于Linux)。
进程运行时,其输出重定向到文件。
这样,如果我需要在进程上显示状态,只需编写少量代码来读取和显示输出文件的内容。
我喜欢这种方法,因为这意味着您可以完全关闭浏览器并稍后轻松返回以检查状态。
答案 2 :(得分:1)
我认为您需要在提供程序上发送数据(确保刷新),然后在请求者上使用fopen / fread读取预期数量的数据,这样您就可以断开与Provider的连接并继续。如果你没有指定预期的数据量,我认为请求者会坐在那里等待提供者关闭连接,这可能直到它运行结束时才会发生(即所有二级工作密集)任务完成)。你需要尝试一些POC ..
祝你好运。答案 3 :(得分:1)
您基本上想要发出1个进程的结束信号(返回原始Requester.php
)并生成一个新进程(结束Provider.php
)。可能有更优雅的方式来解决这个问题,但我已经通过几种不同的方式进行了管理。所有这些都基本上导致执行一个命令,以便关闭第二个进程。
将以下> /dev/null 2>&1 &
添加到命令的末尾将允许它在后台运行而不会阻止当前脚本的实际执行
以下内容可能适合您:
exec("wget -O - \"$url\" > /dev/null 2>&1 &");
- 尽管你也可以将它作为命令行PHP进程。
您还可以保存需要处理的信息,并处理cron作业上的剩余处理,重新创建相同类型的功能,而无需执行。
答案 4 :(得分:0)
将提供商拆分为两个:ProviderCore
和ProviderInterface
。在ProviderInterface
中只需执行“快速简便”部分,还可以在数据库中保存最近请求尚未处理的标志。运行ProviderCore
作为cron作业,搜索该标志并完成处理。如果无事可做,ProviderCore
将终止并重试(比方说)2分钟。
答案 5 :(得分:0)
我在这里走出困境,但也许您应该尝试使用cURL或使用套接字来更新请求者?
答案 6 :(得分:0)
您可以使用pcntl_fork()
在Provider.php中启动另一个php进程Provider.php
{
// Fork process
$pid = pcntl_fork();
// You are now running both a daemon process and the parent process
// through the rest of the code below
if ($pid > 0) {
// PARENT Process
$answer = getAnswer($_GET['data']);
echo $answer;
//SIGNAL TO REQUESTER THAT WE ARE FINISHED
return;
}
if ($pid == 0) {
// DAEMON Process
processDBUpdates();
return;
}
// If you get here the daemon process failed to start
handleDaemonErrorCondition();
return;
}