5

でスクリプトがキャンセルされたかどうかを確認できますdie()register_shutdown_function()?

このようなもの:

register_shutdown_function('shutdown');

die('Calling die()');

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

: 私の Web サイトでは、Smarty を使用しています。それで、$smarty->display()呼ばれたかどうか、またはそのようなことを確認してください。

4

3 に答える 3

6

一種の...しかし、あなたはそれがどのように行われなければならないかを必ずしも気に入らないでしょう。

呼び出されたかどうかを確認できるフックがないためdie、なんとかして偽造する必要があります。へのすべての呼び出しに触れることができないと仮定すると、dieオプションは1つだけになります。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

最初に、 FastCGId にデプロイする場合はdieandを避ける必要があります。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!";
  }
}
于 2012-05-14T16:40:22.323 に答える
1

唯一の方法は、スクリプトの最後にグローバルにアクセス可能な変数を設定することだと思います。この変数が設定されている場合は、shutdown 関数で確認できます。そうでない場合、スクリプトは途中で終了しました。

于 2012-05-14T15:07:03.173 に答える