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

时间:2009-11-01 21:44:04

标签: php

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

7 个答案:

答案 0 :(得分:18)

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

  • 使用cronjob执行任务 定期。
  • 拥有浏览器 请求在a中插入一个新行 数据库表使一个常规 cronjob可以处理新行和 用。执行PHP脚本 适当的论点
  • 有 浏览器请求写入消息 队列系统,具有订户 倾听这些事件(然后 执行脚本)。

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

如果您需要使用进度更新浏览器窗口,则需要使用定期执行的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及时执行)并将用户重定向到“好的,我在它上面”页面。