例如,有一个非常简单的PHP脚本可以更新数据库中的某些表,但这个过程需要很长时间(可能是10分钟).因此,即使用户关闭浏览器,我希望此脚本继续处理,因为有时用户不会等待并关闭浏览器或转到其他网页.
Dav*_*tom 20
如果任务需要10分钟,请不要使用浏览器直接执行它.您还有很多其他选择:
虽然其中一些建议可能对您的情况有些过分,但关键的组合功能是将浏览器请求与作业执行分离,以便可以异步完成.
如果您需要使用progress更新浏览器窗口,则需要使用定期执行的AJAX请求来检索作业状态.
tim*_*dev 15
要直接回答您的问题,请参阅ignore_user_abort
更广泛地说,您可能在这里遇到了架构问题.
如果许多用户可以启动这些东西,您将希望Web应用程序将作业添加到某种类型的队列中,并且具有一定数量的后台进程来咀嚼所有工作.
客户端终止连接后PHP脚本将继续运行(不这样做会带来安全风险),但最多只能max_execution_time
(在php.ini中设置或通过PHP脚本设置,默认情况下通常为30秒).
例如:
<?php
$fh = fopen("bluh.txt", 'w');
for($i=0; $i<20; $i++) {
echo $i."<br/>";
fwrite($fh,$i."\n");
sleep(1);
}
fclose($fh);
?>
Run Code Online (Sandbox Code Playgroud)
在浏览器中开始运行它并在完成之前关闭浏览器.你会发现在20秒后文件包含了所有的值$i
.
将for循环的上限更改为100而不是20,并且您将发现它仅从0到29运行.由于PHP的max_execution_time
脚本超时而死亡.