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

Fra*_*sco 28 javascript php

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

Mör*_*rre 20

见这里:http: //php.net/manual/en/function.ignore-user-abort.php

int ignore_user_abort ([ bool $value ] )
Run Code Online (Sandbox Code Playgroud)

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

当运行PHP作为命令行脚本,并且脚本的tty消失而脚本没有被终止时,脚本将在下次尝试写入任何内容时死亡,除非将值设置为TRUE

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

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

必要的更新

似乎我(不知不觉中)欺骗了我的"声望点",因为我没有提供(正确的)答案,但现在感谢测试并继续从" mellamokb " 轻:

引用:"好的,我看了一下PHP源代码,如果我没有错过任何内容,我现在有了答案.只有当PHP收到错误尝试向用户输出内容时才会检查"ignore_user_abort"标志所以,根据我的理解,没有办法打断不产生任何输出的代码."

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

如果您阅读此内容,请查看下面的评论.

  • @Mörre:总结一下.你在技术上绝对正确.但我几乎是正确的,因为在现实生活中会发生什么.大多数情况下,在PHP脚本完全完成之前,不会对PHP脚本进行连接状态更新,此时它是无关紧要的,因为没有什么可以取消. (3认同)

zza*_*rbi 15

通过Web服务器运行的PHP脚本将不会停止,直到:

  • 有人杀了服务器
  • 服务器杀死php脚本

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

例如,即使用户中止,仍然会继续脚本:

while(true){
    echo 'go'.PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

它会永远持续下去,因为"回声",将写入缓冲区,缓冲区将不会被发送到浏览器,直到脚本完成,这是不会发生的.

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

while(true){
    echo 'go'.PHP_EOL;
    flush();
    ob_flush();
}
Run Code Online (Sandbox Code Playgroud)

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

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