register_shutdown_function()和die()

Kor*_* M. 4 php smarty die

如果我的脚本被取消了die(),我可以以某种方式检查register_shutdown_function()吗?

像这样的东西:

register_shutdown_function('shutdown');

die('Calling die()');

function shutdown()
{
    if (???)
    {
        // Script was canceled by die()
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在我的网站上,我使用Smarty.所以也许检查,如果$smarty->display()被叫或类似的东西?

Jon*_*Jon 6

有点......但你不一定喜欢它是如何完成的.

由于没有钩子允许你检查是否die被调用,你将不得不以某种方式伪造它.假设您无法触及所有调用die,只留下一个选项:设置一些die默认情况下表示" 已被调用"的状态,并在脚本的最末端删除该状态,当您知道要退出时die早先被称为.

"设置一些状态"听起来像全局变量一样可疑,这应该是最后的手段,所以让我们使用状态的常量:

register_shutdown_function('shutdown');
if (condition) die('Calling die()');

// since we reached this point, die was not called
define('DIE_NOT_CALLED', true);

function shutdown()
{
    if (!defined('DIE_NOT_CALLED'))
    {
        // Script was canceled by die()
    }
}
Run Code Online (Sandbox Code Playgroud)

看到它在行动.

  • @Andrew 重点是,在非常常见的情况下,您只有一个出口点(例如前端控制器),您只需在结束时执行此操作一次。而定义 `DIE_CALLED` 将要求您触摸(并保持同步!)所有对 `die` 的调用。这可能是不可能的(例如,您不拥有的代码调用它),如果是,那么您的问题可以通过将调用`die` 与一些可以做任何你喜欢的`custom_die` 的调用交换来非常简单地解决。 (2认同)