【问题标题】:PHP: How to return information to a waiting script and continue processingPHP:如何将信息返回到等待脚本并继续处理
【发布时间】:2016-01-22 17:26:43
【问题描述】:

假设有两个脚本 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;
}

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以使用 flush() 命令刷新输出缓冲区。
    阅读 PHP manual 中的 cmets 了解更多信息

    【讨论】:

      【解决方案2】:

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

      进程运行时将其输出重定向到文件。

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

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

      【讨论】:

        【解决方案3】:

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

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

        以下内容可能对您有用:

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

        -- 虽然您也可以将其作为命令行 PHP 进程来完成。

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

        【讨论】:

          【解决方案4】:

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

          祝你好运。

          【讨论】:

            【解决方案5】:

            将提供程序一分为二:ProviderCoreProviderInterface。在ProviderInterface 中,只需执行“快速简单”的部分,还在数据库中保存一个标志,表明最近的请求尚未处理。运行 ProviderCore 作为 cron 作业,搜索该标志并完成处理。如果无事可做,ProviderCore 将终止并在(比如说)2 分钟后重试。

            【讨论】:

              【解决方案6】:

              我在这里有点冒险,但也许您应该尝试 cURL 或使用套接字来更新请求者?

              【讨论】:

                【解决方案7】:

                您可以使用 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;
                
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-10-10
                  • 2020-07-24
                  • 1970-01-01
                  • 2012-09-16
                  • 2023-03-12
                  • 2011-08-22
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多