7

phpにファイルを含める場合。そのphpに致命的なエラーがある場合、それをスキップする方法はありますか.

<?php
   include "somefile.php";
   echo "OK"; // Is there any way to print this OK  If there is any fatal error on somefile.php
?>

この somefile.php ファイルを含める必要があります。一部のホストでは致命的なエラーが返される場合があります。それらのホストのこのファイルをスキップしたい。

アドバイスしてください。

4

8 に答える 8

4

これにより、致命的なエラーの場合に引き継ぐ独自の継続関数を定義できます。これはregister_shutdown_function()、致命的なエラーをインターセプトするために使用されます。

使用法:

function my_continuation_func($filename, $arg2) {
    // On fatal error during include, continue script execution from here.
    // When this function ends, or if another fatal error occurs,
    // the execution will stop.
}

include_try('my_continuation_func', array($filename, $arg2));
$data = include($filename);
$error = include_catch();

致命的なエラー (解析エラーなど) が発生した場合、スクリプトの実行は から続行されmy_continuation_func()ます。それ以外の場合は、解析中にエラーが発生した場合にinclude_catch()戻ります。true

からの出力 ( などecho 'something';)include()はエラーとして扱われます。trueに 3 番目の引数として渡して出力を有効にしない限りinclude_try()

このコードは、シャットダウン機能で可能な作業ディレクトリの変更を自動的に処理します。

これは任意の数のインクルードに使用できますが、発生する 2 番目の致命的なエラーは傍受できません: 実行は停止します。

含まれる機能:

function include_try($cont_func, $cont_param_arr, $output = false) {
    // Setup shutdown function:
    static $run = 0;
    if($run++ === 0) register_shutdown_function('include_shutdown_handler');

    // If output is not allowed, capture it:
    if(!$output) ob_start();
    // Reset error_get_last():
    @user_error('error_get_last mark');
    // Enable shutdown handler and store parameters:
    $params = array($cont_func, $cont_param_arr, $output, getcwd())
    $GLOBALS['_include_shutdown_handler'] = $params;
}

function include_catch() {
    $error_get_last = error_get_last();
    $output = $GLOBALS['_include_shutdown_handler'][2];
    // Disable shutdown handler:
    $GLOBALS['_include_shutdown_handler'] = NULL;
    // Check unauthorized outputs or if an error occured:
    return ($output ? false : ob_get_clean() !== '')
        || $error_get_last['message'] !== 'error_get_last mark';
}

function include_shutdown_handler() {
    $func = $GLOBALS['_include_shutdown_handler'];
    if($func !== NULL) {
        // Cleanup:
        include_catch();
        // Fix potentially wrong working directory:
        chdir($func[3]);
        // Call continuation function:
        call_user_func_array($func[0], $func[1]);
    }
}
于 2014-01-31T14:36:22.510 に答える
2

Fatal は致命的なことを意味します... 致命的なエラーから回復する方法はありません。

于 2013-06-18T05:03:24.717 に答える
1

PHP won't tolerate with Fatal Errors. Best to check the included file and solve it. Actually, you can try looking at register-shutdown-function, but it's not recommended to run away from your problems.

于 2013-06-18T05:10:06.640 に答える
0

編集:私は致命的な言葉を逃しました。前述のとおり、致命的なエラーから回復することはできません。それが単なる例外である場合は、以下の急いで書かれた応答が機能します。

別の php モジュールをインクルードすることは、そのコードがインラインで挿入されることと同じであるため、単純なtry-catchステートメントが機能するはずです。

<?php
    try {
        include "somefile.php";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
    echo "OK"; 
 ?>
于 2013-06-18T05:03:26.930 に答える
0

Fatal Error は、インクルード コードに深刻な問題があることを意味します。@Orangepillが言ったように、この致命的なエラーメッセージのポップアップを止める方法はありません. コーディングを調べて、エラーを見つけてください。

于 2013-06-18T05:10:22.190 に答える
0

致命的なエラーで停止しないset_error_handler () 関数を設定してみますが、代わりに Apache がクラッシュしました。言い換えれば、システムが死なないように、PHP は死ななければなりません。

このリンクを参照してください

于 2013-06-18T05:04:44.113 に答える