【问题标题】:long running php script called via ajax (Don't want to wait for response)通过 ajax 调用的长时间运行的 php 脚本(不想等待响应)
【发布时间】:2013-03-07 05:14:55
【问题描述】:

我有一个长时间运行的脚本,可以运行一段时间。 (它每 5 秒发送一封电子邮件)给许多用户。此脚本通过 ajax 请求触发

  1. 如果浏览器关闭等响应没有收到,脚本会继续运行吗? (好像有,但有什么条件什么时候不会?

  2. 睡眠是否计入最大执行时间。 (看来这也是假的)

【问题讨论】:

  • 您可能应该使用 cron 或作业队列。
  • 同意,我只是想知道。我正在使用 apache 2 和 php 5
  • 不是你问的,但可能对你有用。 stackoverflow.com/questions/222414/… 您可以从 cli 异步运行这样的脚本,让您的 ajax 客户端断开连接,而不会影响您的电子邮件进程。

标签: php


【解决方案1】:

1。 简短的回答是:这取决于。 事实上,它可以在 PHP 和您使用的 Web 服务器中进行配置。这取决于您使用 PHP 的模式(模块或 CGI 或其他)。 不过,您有时可以配置它。 php.ini中有一个选项:

/* If enabled, the request will be allowed to complete even if the user aborts
; the request. Consider enabling it if executing long requests, which may end up
; being interrupted by the user or a browser timing out. PHP's default behavior
; is to disable this feature.
; http://php.net/ignore-user-abort
;ignore_user_abort = On*/

2。几乎总是睡眠很重要。在某些情况下它没有,但在这种情况下,不是测量 执行时间,而是测量 执行 cpu 时间。 IIS 确实按应用程序池计算 CPU 使用率,但不确定它如何应用于 PHP 脚本。
确实,PHP 不会杀死现在处于睡眠状态的脚本。这意味着一旦睡眠结束,脚本将被终止(简单测试:将sleep(15); 添加到您的 php 并将最大执行时间设置为 10。您将收到关于时间限制的错误,但在 15 秒内,而不是在 10 秒内)。
一般来说,您可以不在脚本中随意使用 sleeps。

您也不应该依赖在 Web 服务器中没有用户(浏览器)的情况下运行的脚本。您显然是在用错误的方法解决问题:您确实应该考虑使用 cron 作业/单独的任务。

【讨论】:

    【解决方案2】:
    1. 这取决于服务器。一些服务器可以在套接字关闭时终止脚本(这可能会在浏览器关闭时发生),其他服务器可以让脚本执行直到达到超时。

    2. 同样,将取决于服务器。我真的可以看到一个实现,查看脚本在 CPU 上加载的时间,然后再一次 - 仅测量脚本启动的时间是一个同样好的方法。这完全取决于制作服务器软件的人的目的。

    如果您想得到明确的答案,我建议您筛选运行您的脚本的网络服务器和 php 实现的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      相关资源
      最近更新 更多