5

我可以以某种方式检查我的脚本是否被 in 取消die()register_shutdown_function()

像这样的东西:

register_shutdown_function('shutdown');

die('Calling die()');

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

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

4

3 回答 3

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()
    }
}

看到它在行动

于 2012-05-14T15:10:54.477 回答
1

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

于 2012-05-14T15:07:03.173 回答
1

die首先,exit如果你在 FastCGId 上部署,你应该避免。它会杀死进程,从而防止它们被重新用于另一次运行。

如果您只是想检查 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!";
  }
}
于 2012-05-14T16:40:22.323 回答