例如,有一个非常简单的PHP脚本可以更新数据库中的某些表,但这个过程需要很长时间(可能是10分钟)。因此,即使用户关闭浏览器,我希望此脚本继续处理,因为有时用户不会等待并关闭浏览器或转到其他网页。
答案 0 :(得分:18)
如果任务需要10分钟,请不要使用浏览器直接执行。您还有很多其他选择:
虽然其中一些建议可能对您的情况有些过分,但关键的组合功能是将浏览器请求与作业执行分离,以便可以异步完成。
如果您需要使用进度更新浏览器窗口,则需要使用定期执行的AJAX请求来检索作业状态。
答案 1 :(得分:12)
要直接回答您的问题,请参阅ignore_user_abort
更广泛地说,这里可能存在架构问题。
如果许多用户可以启动这些内容,您将希望Web应用程序将作业添加到某种队列中,并且有一定数量的后台进程可以完成所有工作。
答案 2 :(得分:6)
客户端终止连接后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);
?>
开始在浏览器中运行它并在完成之前关闭浏览器。您会发现在20秒后文件包含$i
的所有值。
将for循环的上限更改为100而不是20,并且您将发现它仅从0到29运行。由于PHP的max_execution_time
,脚本超时并死亡。
答案 3 :(得分:3)
如果脚本完全基于服务器(对用户没有反馈),即使客户端关闭,也会这样做。
PHP的一般体系结构是客户端向脚本发送请求,该脚本向用户发送回复。如果没有任何回复给用户,即使用户不在另一侧,脚本仍将执行。更简单:它们在常规脚本上没有服务器和客户端之间的持续连接。
答案 4 :(得分:1)
你可以使用crontab文件每20分钟运行一次PHP脚本,该文件包含时间和在这种情况下运行的命令,它将是php脚本。
答案 5 :(得分:0)
是。服务器不知道用户是否关闭了浏览器。至少它没有立即注意到。
否:服务器可能(取决于它的配置方式)不允许php脚本运行10分钟。在廉价的共享主机上,我不会依赖运行时间超过合理响应时间的脚本。
答案 6 :(得分:-1)
无论客户端在做什么,服务器端脚本都会继续执行它所做的事情。
编辑:顺便说一下,你确定你想要打开10分钟的页面吗?我建议你使用一个任务队列(其项目由cron及时执行)并将用户重定向到“好的,我在它上面”页面。