如果用户通过php进程在中间退出浏览器而中止会发生什么?

时间:2015-01-30 15:05:58

标签: php security process

默认情况下,ignore_user_abort的PHP设置设置为False, 假设我有以下代码:

1  1ms   $user->giveMoney(500) 
2  2ms   $user->sendNotification("You got 500")
3  1ms   $user->takeCoins(200)

如果用户在3毫秒后中止浏览器怎么办?第3行会被执行吗?

2 个答案:

答案 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,因此此设置可以是falsetrue,它不会改变任何内容。

在你的情况下,该男子声称:

  

在尝试向客户端发送信息之前,PHP不会检测到用户已中止连接。仅使用echo语句并不能保证信息的发送,请参阅flush()

也就是说:脚本将继续运行,直到实际输出真正发送到客户端。只有这样,PHP才能确定与客户端的连接是否仍然存在。如果它不是那么您的脚本将停止。

因此,除非在第二行代码中发送了一些实际输出,并且刷新了任何输出缓冲区,否则第三行将执行。如果输出已发送,则脚本可能会暂停 但是如果你真的想在连接丢失的情况下阻止执行第三个语句,那么可能在第二个方法返回后调用connection_aborted

$user->sendNotification("You got 500");
if (connection_aborted())
    exit(0);//no error code, just exit
$user->takeCoins(200);