即使在关闭页面后,脚本是否仍会继续运行?

2022-08-30 14:55:46

如果我通过jquery ajax调用一个php文件,其中包含一个脚本来做一些需要一段时间的事情 - 例如上传一个大视频 - 然后我关闭页面:php脚本是否继续加载视频?


答案 1

请参阅此处:http://php.net/manual/en/function.ignore-user-abort.php

int ignore_user_abort ([ bool $value ] )

设置客户端断开连接是否应导致脚本中止。

当将 PHP 作为命令行脚本运行时,如果脚本的 tty 在脚本未终止的情况下消失,则脚本将在下次尝试写入任何内容时死亡,除非将 value 设置为 TRUE

还有一个同名的PHP配置选项:http://php.net/manual/en/misc.configuration.php

默认情况下,如果您不执行任何操作,根据 PHP 手册,默认设置是中止脚本。http://php.net/manual/en/features.connection-handling.php

必要的更新

似乎我(在不知不觉中)欺骗了我的“声誉点”,因为我没有提供(正确的)答案,但现在这要归功于测试和继续从“mellamokb”中轻推:

Ta说:“好吧,我看了一下PHP源代码,如果我没有错过任何东西,我现在就有了答案。仅当 PHP 在尝试向用户输出内容时收到错误时,才会检查“ignore_user_abort”标志。因此,在我的理解中,没有办法中断不产生任何输出的代码。

好吧,我并没有完全关闭,但重要的是要知道这一切都取决于您的脚本是否产生了任何输出!

如果您阅读了 THIS,也请查看下面的评论。


答案 2

通过 Web 服务器运行的 PHP 脚本在以下操作之前不会停止:

  • 有人杀死了服务器
  • 服务器杀死 php scrip

当用户中止脚本时,PHP 将继续,直到它尝试将某些内容发送回浏览器。

例如,即使用户中止,still 脚本仍将继续执行:

while(true){
    echo 'go'.PHP_EOL;
}

它将永远持续下去,因为“echo”将写入缓冲区,并且在脚本完成之前,缓冲区不会发送到浏览器,这永远不会发生。

一旦用户中止,以下脚本将立即停止:

while(true){
    echo 'go'.PHP_EOL;
    flush();
    ob_flush();
}

此脚本将停止,因为 flush() 和 ob_flush() 将强制 PHP 将其缓冲区发送到浏览器,如果用户中止,这将停止 PHP 脚本。在这种情况下,函数 ignore-user-abort() 将强制 PHP 忽略中止。

此外,如果您使用的是PHP会话,则它们是另一种棘手的情况。例如,如果您正在执行 AJAX,并且您实际上向 PHP 脚本发送了两个 AJAX 请求,并且该 PHP 脚本需要与 session_start() 进行会话。第一个 AJAX 查询将正常工作,但第二个查询必须等到第一个调用完成,因为第一个脚本在会话上有一个锁定。第一个脚本最终可能会过早地使用session_write_close()释放会话;