发送 HTTP 响应后继续执行 PHP

2022-08-30 08:55:36

如何让 PHP 5.2(以 apache mod_php 的形式运行)向客户端发送完整的 HTTP 响应,然后继续执行操作一分钟?

长话短说:

我有一个PHP脚本,它必须执行几个长数据库请求并发送电子邮件,这需要45到60秒才能运行。此脚本由我无法控制的应用程序调用。我需要应用程序报告从PHP脚本收到的任何错误消息(主要是无效参数错误)。

应用程序的超时延迟短于 45 秒(我不知道确切的值),因此将 PHP 脚本的每次执行都注册为错误。因此,我需要PHP尽快将完整的HTTP响应发送到客户端(理想情况下,一旦输入参数被验证),然后运行数据库和电子邮件处理。

我正在运行mod_php,因此不可用。我可以通过将要处理的数据保存到数据库并运行实际进程来解决此问题,但我正在寻找一个更短的解决方案。pcntl_forkcron


答案 1

我在我的“特殊脚本”工具箱中有这个片段,但它丢失了(当时云并不常见),所以我在寻找它并提出了这个问题,惊讶地发现它丢失了,我搜索了更多,然后回到这里发布它:

<?php
 ob_end_clean();
 header("Connection: close");
 ignore_user_abort(); // optional
 ob_start();
 echo ('Text the user will see');
 $size = ob_get_length();
 header("Content-Length: $size");
 ob_end_flush(); // Strange behaviour, will not work
 flush();            // Unless both are called !
 session_write_close(); // Added a line suggested in the comment
 // Do processing here 
 sleep(30);
 echo('Text user will never see');
?>

我实际上在几个地方使用它。这完全是有道理的:银行链接正在返回成功付款的请求,当这种情况发生时,我必须调用很多服务并处理大量数据。这有时需要超过10秒,但银行链接具有固定的超时期限。所以我承认银行链接,并给他指明出路,并在他已经离开时做我的事情。


答案 2

让处理初始请求的脚本在处理队列中创建一个条目,然后立即返回。然后,创建一个单独的进程(可能通过 cron),定期运行队列中挂起的任何作业。


推荐