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


6

假设有两个脚本Requester.php和Provider.php,并且请求者需要从提供者处理并向其发出http请求(Provider.php?data =“数据”)。在这种情况下,提供者很快找到答案,但要维护系统必须在整个数据库中执行各种更新。是否有办法立即将值返回给Requester,然后继续在Provider中处理。

的伪代码

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

你基本上要1个信号处理(返回到原来的Requester.php)的结束和产生新的进程(完Provider.php)。可能有一种更优雅的方式来解决这个问题,但我已经用几种不同的方式来管理这个。他们基本上都会导致执行一个命令,以便关闭第二个进程。

添加以下> /dev/null 2>&1 &到命令的结尾将允许它在后台不会抑制当前的脚本的实际执行运行

像下面的内容可能会为你工作:

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

- 尽管您也可以将它作为命令行PHP进程来执行。

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


2

可以刷新与冲洗()命令的输出缓冲器。
阅读在PHP manual评论更多信息


0

斯普利特提供两种:ProviderCoreProviderInterface。在ProviderInterface中,只需执行“快速且简单”的部分,还可以在数据库中保存最近请求尚未处理的标志。运行ProviderCore作为cron作业,搜索该标志并完成处理。如果无事可做,ProviderCore将终止并在2分钟内(例如)重试。


1

我认为你需要在提供者上发送数据(一定要刷新),然后在请求者上使用fopen/fread读取预期的数据量,这样你就可以把连接放到提供商并继续。如果您没有指定大量的数据,我会认为请求者会坐在那里等待提供程序关闭连接,这可能直到运行结束才会发生(即所有的辅助工作密集型任务完成)。你需要尝试几个POC的..

祝你好运。


2

我使用this code在后台运行进程(在Linux上运行)。

该进程将其输出重定向到文件。

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

我喜欢这种方式,因为这意味着您可以完全关闭浏览器,稍后再回来查看状态。


0

我在这里出去走走,但也许你应该尝试cURL或使用套接字来更新请求者?


0

你可以使用pcntl_fork()

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; 

} 
启动另一个PHP程序中Provider.php