register_shutdown_function()和die()

时间:2012-05-14 15:01:45

标签: php smarty die

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

这样的事情:

register_shutdown_function('shutdown');

die('Calling die()');

function shutdown()
{
    if (???)
    {
        // Script was canceled by die()
    }
}

注意:在我的网站上,我使用Smarty。那么可以检查一下,如果调用$smarty->display()或类似的东西?

3 个答案:

答案 0 :(得分: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()
    }
}

<强> See it in action

答案 1 :(得分:1)

我认为唯一的方法是在脚本末尾设置一个全局可访问的变量。如果已设置此变量,则可以检查关闭功能。如果没有,脚本就会过早终止。

答案 2 :(得分:0)

首先,如果要在FastCGId上部署,则应避免使用dieexit。它会杀死进程,从而阻止它们被重新用于另一次运行。

如果您只想检查Smarty是否输出了某些内容,您可能需要尝试以下内容:

MySmarty extends Smarty {
  public static $_has_displayed = false;
  public function display(/* params */) {
    $t = parent::display(/* params */);
    self::$_has_displayed = true;
    return $t;
  }
}

register_shutdown_function('foo');
function foo() {
  if (!MySmarty::$_has_displayed) {
    echo "OMG I failed!";
  }
}