1

これについてまともな考えを求める:

PHPコードに、任意の外部コードを実行し、インクルージョンの1つが失敗した場合にコールバック関数を呼び出すメカニズムを実装したいと思います( includerequire+ *_once)。

外部コードとは、実行されるコードが私によって作成されておらず、制御できないことを意味します。テスト用に含まれています。したがって、インクルージョンの失敗に関する詳細な情報をより深く持つことは役に立ちます。

PHPの致命的なエラーが発生したときにコールバックを行うことが不可能に見えるという問題に直面しています。

私がこれまでに試したこと:

  • -を介したエラーハンドラの登録set_error_handler-致命的なエラーでは機能しません。
  • メソッドを使用してオブジェクトインスタンスを作成しました__destruct()-致命的なエラーで呼び出されません。
  • シャットダウン関数を登録しました-致命的なエラーでは呼び出されません。

debug_backtraceこれらのいずれにおいても、私はaをフェッチして、与えられた情報を処理したかっただけです。

したがって、すぐに質問があります。PHPコード内から失敗したファイルインクルードを追跡し、関数を呼び出す方法です。

私の最近の試みと検索からの質問への答えがノーであると私は恐れているので、洞察に満ちたものは何でも高く評価されます。たとえあなたの答えが「不可能」な点を強化するだけだとしても。

さらに、どのファイルが含まれるかを見つけることができる場合にも役立ちます。したがって、少なくとも含める前に(失敗するかどうかにかかわらず)デバッグ出力を作成することができます。

備考:

  • 拡張機能なしが望ましい。しかし、何かがあれば、私も知りたいです。
  • 外部コードとは、実行されるコードが私によって作成されておらず、制御できないことを意味します。テスト用に含まれています。したがって、インクルージョンの失敗に関する詳細な情報をより深く持つことは役に立ちます。

関連している:

4

2 に答える 2

2

私の提案はテストされていません、ここに試すべきいくつかのことがあります:

必要な/含まれているphpファイルがクラスの場合、自動ロードはオプションである可能性があります

function __autoload($class)
{
    // try to load
}

require /includesをtrycatchブロックでラップできる場合は、例外を使用するようにエラーハンドラーを設定しても機能する可能性があります。更新:機能しません:(

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

テストする必要のあるコードをpopenとxdebugを使用してコマンドラインでテストできる場合、pclose-1が返された場合は別のプロセスでプログラムを実行し、 xdebugからのバックトレースを解析できます。

    $cmd = 'php --php-ini path/php.ini file/to/run.php';
    $output = '';
    $popen  = popen($cmd, 'rb');

    while (!feof($popen)) {
        $output .= fread($popen, 4096);
    }

    if (pclose($popen) < 0) {
        // error - parse $output for xdebug backtrace
    }
于 2011-07-09T15:44:28.423 に答える
0

あなたはそれを必要としません。クラスをロードするには、__autoload関数を使用します。静的ファイルを含めるには、require_onceを使用します。動的ファイルをロードするには、使用する前にそれらをチェックし(file_exeists、is_readableなど)、ファイルがバックトレースを取得することが見つからない場合は例外をスローする必要があります。

于 2011-07-09T16:04:57.500 に答える