如果register_shutdown_function()
中的die()
取消了我的脚本,我可以以某种方式检查吗?
这样的事情:
register_shutdown_function('shutdown');
die('Calling die()');
function shutdown()
{
if (???)
{
// Script was canceled by die()
}
}
注意:在我的网站上,我使用Smarty。那么可以检查一下,如果调用$smarty->display()
或类似的东西?
答案 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上部署,则应避免使用die
和exit
。它会杀死进程,从而阻止它们被重新用于另一次运行。
如果您只想检查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!";
}
}