如果我通过jquery ajax调用一个php文件,其中包含一个脚本来做一些需要一段时间的事情,比如上传一个大的视频,然后我关闭页面: php脚本是否继续加载视频?
发布于 2011-05-14 04:00:51
查看此处:http://php.net/manual/en/function.ignore-user-abort.php
布尔整数ignore_user_abort (
$value )
设置客户端断开连接是否应导致脚本中止。
当PHP作为命令行脚本运行时,如果脚本的tty消失而不会终止脚本,则脚本将在下次尝试写入任何内容时终止,除非将value设置为TRUE
还有一个同名的PHP配置选项:http://php.net/manual/en/misc.configuration.php
默认情况下,如果您什么也不做,根据PHP手册,默认情况下将中止脚本。http://php.net/manual/en/features.connection-handling.php
必要的更新
看起来我(在不知不觉中)骗到了“名誉点”,因为我没有提供(正确的)答案,但现在要感谢测试和来自“”的持续微调:
Quote:“好的,我看了一下PHP的源代码,如果我没有遗漏任何东西,我现在有了答案。"ignore_user_abort”标志只在PHP接收到试图输出给用户的错误时才会被检查。所以,在我的理解中,没有办法中断不产生任何输出的代码。“
好吧,我并不是完全错了,但重要的是要知道这一切都取决于你的脚本是否产生了任何输出!
如果你读了这篇文章,也一定要看看下面的评论。
发布于 2011-05-14 05:16:59
在以下情况之前,通过web服务器运行的PHP脚本不会停止:
当用户中止脚本时,PHP将继续运行,直到它尝试将某些内容发送回浏览器。
例如,即使用户中止,静态脚本也将继续执行:
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忽略abort。
此外,如果您使用的是PHP会话,这是另一个棘手的情况。例如,如果您正在进行AJAX,并且您实际上向一个PHP脚本发送了两个AJAX请求,并且该脚本需要与session_start()进行会话。第一个AJAX查询将正常工作,但是第二个查询必须等到第一个调用完成,因为第一个脚本锁定了会话。第一个脚本最终可能过早地释放session_write_close()会话;
发布于 2011-05-14 04:06:00
默认情况下为no。请参阅Connection Handling文档,特别是:
您可以决定是否希望客户端断开连接以使脚本中止。有时,即使没有远程浏览器接收输出,总是让脚本运行到完成也是很方便的。但是,默认行为是在远程客户端断开连接时中止脚本。
https://stackoverflow.com/questions/5997102
复制相似问题