我有一个长时间运行的脚本,可以运行一段时间。(它每 5 秒发送一封电子邮件)给许多用户。此脚本是通过 ajax 请求触发的
如果没有收到响应,例如关闭浏览器,脚本会继续运行吗?(看起来确实有,但有什么条件什么时候不会?
睡眠是否计入最大执行时间。(看来这也是假的)
我有一个长时间运行的脚本,可以运行一段时间。(它每 5 秒发送一封电子邮件)给许多用户。此脚本是通过 ajax 请求触发的
如果没有收到响应,例如关闭浏览器,脚本会继续运行吗?(看起来确实有,但有什么条件什么时候不会?
睡眠是否计入最大执行时间。(看来这也是假的)
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 作业/单独的任务。
这取决于服务器。一些服务器可以在套接字关闭时终止脚本(这可能会在浏览器关闭时发生),其他服务器可以让脚本执行直到达到超时。
同样,将取决于服务器。我真的可以看到一个实现,查看脚本在 CPU 上加载的时间,然后再一次 - 仅测量脚本启动的时间是一个同样好的方法。这完全取决于制作服务器软件的人的目的。
如果您想要明确的答案,我建议您筛选运行您的脚本的网络服务器和 php 实现的文档。