如果用户因 php 进程在中间退出浏览器而中止,会发生什么情况?

What happens if user aborted by php process exiting browser in the middle?

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

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

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

您可以使用 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 以获取更多参考资料。

是的,它会,因为您发布的代码似乎没有产生任何输出,而您询问的是客户端-服务器上下文中的行为。如前所述 in the docs:

When running PHP as a command line script, and the script's tty goes away without the script being terminated then the script will die the next time it tries to write anything, unless value is set to TRUE

我已经突出显示了一些关键词:此设置处理 PHP 当它用于 命令行脚本 时。您提到一个客户端,正在关闭 his/her 浏览器。没有 TTY,所以这个设置可以是 falsetrue,它不会改变任何东西。

不过,在你的情况下,该男子表示:

PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush().

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

因此,除非在第二行代码中发送了一些实际输出,并且刷新了所有输出缓冲区,否则第三行将执行。如果发送了输出,那么脚本可能会停止。
但是如果你真的想防止在连接丢失的情况下执行第三条语句,那么也许在第二种方法 returns:

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