即使用户关闭了浏览器,PHP脚本也可以继续运行吗?

Ogu*_*gic 25 php

例如,有一个非常简单的PHP脚本可以更新数据库中的某些表,但这个过程需要很长时间(可能是10分钟).因此,即使用户关闭浏览器,我希望此脚本继续处理,因为有时用户不会等待并关闭浏览器或转到其他网页.

Dav*_*tom 20

如果任务需要10分钟,请不要使用浏览器直接执行它.您还有很多其他选择:

  • 使用cronjob定期执行任务.
  • 让浏览器请求在数据库表中插入一个新行,以便常规cronjob可以处理新行并使用适当的参数执行PHP脚本
  • 让浏览器请求向队列系统写入消息,队列系统有一个订阅者监听此类事件(然后执行脚本).

虽然其中一些建议可能对您的情况有些过分,但关键的组合功能是将浏览器请求与作业执行分离,以便可以异步完成.

如果您需要使用progress更新浏览器窗口,则需要使用定期执行的AJAX请求来检索作业状态.

  • +1是我的答案的更好,更具体的版本. (2认同)

tim*_*dev 15

要直接回答您的问题,请参阅ignore_user_abort

更广泛地说,您可能在这里遇到了架构问题.

如果许多用户可以启动这些东西,您将希望Web应用程序将作业添加到某种类型的队列中,并且具有一定数量的后台进程来咀嚼所有工作.


bco*_*lan 7

客户端终止连接后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脚本超时而死亡.