默认情况下,ignore_user_abort的PHP设置设置为False, 假设我有以下代码:
1 1ms $user->giveMoney(500)
2 2ms $user->sendNotification("You got 500")
3 1ms $user->takeCoins(200)
如果用户在3毫秒后中止浏览器怎么办?第3行会被执行吗?
答案 0 :(得分:1)
您可以使用http://php.net/manual/en/misc.configuration.php#ini.ignore-user-abort
控制该行为在配置级别(例如.htaccess文件上),您可以设置标志:
php_flag ignore_user_abort 1
在脚本级别(仅对该脚本有效),您可以调用此函数:
ignore_user_abort(1)
注意:文档有点误导。 ignore_user_abort
也在服务器上运行。有关更多参考资料,另请参阅this page。
答案 1 :(得分:1)
是的,它会看到你发布的代码似乎没有产生任何输出,并且你在客户端 - 服务器环境中询问行为。如上所述in the docs:
将PHP作为 命令行脚本 运行时,脚本的 tty 消失了如果脚本没有被终止,则下次尝试写入任何内容时脚本将会死亡,除非将值设置为
TRUE
我突出了一些关键词:当设置用于命令行脚本时,此设置会处理PHP。你提到一个客户端,关闭他/她的浏览器。没有TTY,因此此设置可以是false
或true
,它不会改变任何内容。
在你的情况下,该男子声称:
在尝试向客户端发送信息之前,PHP不会检测到用户已中止连接。仅使用
echo
语句并不能保证信息的发送,请参阅flush()
。
也就是说:脚本将继续运行,直到实际输出真正发送到客户端。只有这样,PHP才能确定与客户端的连接是否仍然存在。如果它不是那么您的脚本将停止。
因此,除非在第二行代码中发送了一些实际输出,并且刷新了任何输出缓冲区,否则第三行将执行。如果输出已发送,则脚本可能会暂停
但是如果你真的想在连接丢失的情况下阻止执行第三个语句,那么可能在第二个方法返回后调用connection_aborted
:
$user->sendNotification("You got 500");
if (connection_aborted())
exit(0);//no error code, just exit
$user->takeCoins(200);