我应该始终将ignore_user_abort设置为true吗?

时间:2018-09-11 21:50:01

标签: php

直到最近,我什至没有意识到PHP可能由于用户断开而中止脚本。

无论如何,如果脚本可能在中途中止,则可能对我的数据库造成一些实际麻烦。就像如果我将行插入到部分相互依赖的多个表中,并且只有一半完成了,我将不得不在编程中获得真正的防御。

奇怪的是,我发现ignore_user_abort默认为false(至少在我的安装中如此),这似乎会使由于某些原因而出错的开发人员不知道这种可能性而感到困惑。 / p>

为了使事情变得更容易,我是否不应该总是将其设置为true?还是有很好的理由将其默认设置为false?

2 个答案:

答案 0 :(得分:2)

  

无论如何,如果脚本可能在中途中止,则可能对我的数据库造成一些实际麻烦。就像如果我将行插入到部分相互依赖的多个表中,并且只有一半完成了,我将不得不在编程中获得真正的防御。

在有或没有ignore_user_abort的情况下都可能发生这种情况,应使用database transactions解决。

  

为了使事情变得更容易,我是否不应该总是将其设置为true?还是有很好的理由将其默认设置为false?

由于人们通常是为Web编写PHP代码,因此忽略用户中止意味着您的服务器将无所事事,而这将毫无价值。它们足够多,您可能会发现服务器因长时间运行的废弃HTTP请求而陷入瘫痪。

如果您有很多长时间运行的请求应该忽略用户中止,那么队列是一种更好的方法。

答案 1 :(得分:1)

将true传递给ignore_user_abort()作为其唯一参数将指示PHP即使最终用户关闭浏览器,导航到另一个站点或单击“停止”,脚本也不会终止。如果您要执行一些重要的处理并且即使您的用户单击“取消”,也不想停止它,例如用信用卡进行付款,这将很有用。您当然也可以将false传递给ignore_user_abort(),从而使PHP在用户关闭连接时退出。

对于处理关闭任务,register_shutdown_function()很完美,因为它允许您向PHP注册在脚本执行结束时要运行的函数,因此它取决于您的项目