如何让PHP5.2(以apache运行)向客户端发送完整的mod_php响应,然后继续执行操作一分钟?
说来话长:
我有一个PHP脚本,它必须执行几个长的数据库请求并发送电子邮件,这需要45到60秒才能运行。这个脚本是由我无法控制的应用程序调用的。我需要应用程序报告从PHP脚本收到的任何错误消息(主要是无效参数错误)。
应用程序的超时延迟小于45秒(我不知道确切的值),因此每次执行PHP脚本时都会注册为错误。因此,我需要PHP尽快将完整的HTTP响应发送到客户机(理想情况下,只要验证了输入参数),然后运行数据库和电子邮件处理。
我运行的是mod_php,所以pcntl_fork
不可用。我可以通过将要处理的数据保存到数据库并从cron
运行实际过程来解决这个问题,但我正在寻找一种更短的解决方案。
发布于 2010-10-01 01:14:29
让处理初始请求的脚本在处理队列中创建一个条目,然后立即返回。然后,创建一个单独的进程(可能通过cron ),该进程定期运行队列中挂起的任何作业。
发布于 2013-01-23 06:38:59
我在我的“特殊脚本”工具箱中有这个片段,但它丢失了(当时云还不常见),所以我在寻找它,并提出了这个问题,惊讶地发现它不见了,我搜索了更多,并回到这里发布它:
<?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');
?>
实际上,我在一些地方使用它。这是完全有道理的: banklink将返回成功付款的请求,当这种情况发生时,我必须调用许多服务和处理大量数据。这有时需要10秒以上的时间,但banklink有固定的超时时间。因此,我承认banklink,并告诉他出路,当他已经离开时,我做我的事情。
发布于 2010-10-01 02:33:18
您需要的是这种设置
https://stackoverflow.com/questions/3833013
复制相似问题