PHPでrequire()やinclude()のエラーを捕捉するには?

私は特定のファイルのコードを必要とするPHP5でスクリプトを書いています。ファイルをインクルードできない場合は、まず警告が表示され、その後致命的なエラーがスローされます。コードを含めることができなかったときに、私は自分自身のエラーメッセージを出力したいと思います。 requeireが機能しなかった場合、最後のコマンドを実行することは可能ですか?次のように動作しませんでした:

require('fileERROR.php5') or die("Unable to load configuration file.");

error_reporting(0)を使用してすべてのエラーメッセージを抑制すると、白い画面しか表示されず、error_reportingを使用しないとPHPのエラーが表示されます。

10

5 答え

これを行うには、 set_error_handler ErrorException と組み合わせて使用​​します。

ErrorException ページの例は次のとおりです。

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

/* Trigger exception */
strpos();
?>

例外として処理されるエラーが発生したら、次のようなことができます:

<?php
try {
    include 'fileERROR.php5';
} catch (ErrorException $ex) {
    echo "Unable to load configuration file.";
   //you can exit or die here if you prefer - also you can log your error,
   //or any other steps you wish to take
}
?>
12
追加された
@SajnEvardsson PHPマニュアルにErrorExceptionという3番目のパラメータがあります。もう1つは$ errnoではありません。
追加された 著者 Basit,
上記の例はErrorExceptionドキュメント(上記のリンク)から直接コピーされています - 公式の例では$ errnoを$ codeとして使用していますが、他のページ(そのページのコメントを含む)は$ severityとして使用することを提案していますあなたが好きなら、あなたは両方のためにそれを使うことも、どちらにも使うこともできません。
追加された 著者 Sjan Evardsson,

私は 'file_exists()'を使うだけです:

if (file_exists("must_have.php")) {
    require "must_have.php";
}
else {
    echo "Please try back in five minutes...\n";
}
10
追加された
is_readable()を使用する方が効果的です。ファイルの可読性に加えて、ファイルの存在をチェックします(単純に、ファイルは読み取り可能でなければなりません)。また、ディレクトリを含めないようにするには、 is_dir()(is_dir($ filename) )。
追加された 著者 MAChitgarha,

より良いアプローチは、最初にパス上で実際のパスを使用することです。ファイルが存在しない場合、 realpath false を返します。

$filename = realpath(getcwd() . "/fileERROR.php5");
$filename && return require($filename);
trigger_error("Could not find file {$filename}", E_USER_ERROR);

PHPのrequire関数をラップする、アプリケーションの名前空間に独自のrequire関数を作成することもできます

namespace app;

function require_safe($filename) {
  $path = realpath(getcwd() . $filename);
  $path && return require($path);
  trigger_error("Could not find file {$path}", E_USER_ERROR);
}

これで、ファイルのどこにでも使用できます

namespace app;

require_safe("fileERROR.php5");
3
追加された
PHP CLI/consoleで実行すると、なぜ、あなたのコードが正しく動作しない(誤った肯定を生成する)のか分かりません。私。実際には存在しますが、あなたのコードをコメントアウトして直接 include()に行くと、ファイルXYZが存在しないというスクリプトの実行は停止し、ファイルはエラーなしでインクルードされます。
追加された 著者 trejder,

最近のコメントは、 set_error_handler()のドキュメントにあります。関数。

致命的なエラーを捕捉する方法(および例を挙げる)として、次のように示唆しています。

<?php
function shutdown()
{
    $a=error_get_last();
    if($a==null)  
        echo "No errors";
    else
         print_r($a);

}
register_shutdown_function('shutdown');
ini_set('max_execution_time',1 );
sleep(3);
?> 

私はこの提案を試していないが、これは他の致命的なエラーシナリオでも使用される可能性がある。

1
追加された
これはうまくいくかもしれませんが、それは良い質問を出します、もしこれが条件でうまくいくならば、OPは尋ねていますか?私はここにいるほとんどの人が、存在しないファイル require をキャッチしてスクリプトの実行を続けることができるソリューションを探していると考えています。正常に死ぬことができれば(つまり、何かを表示すると、スクリプトの終了でさえも終わりますが、それはコードがやっているようです)、多くのシナリオには当てはまりません。私は、スクリプトが死ぬかどうか望むものを何でも表示できると思います。私は、 require に供給された存在しないファイルに対するダイ/ターミネーションを防止したい。
追加された 著者 trejder,

あなたはinclude()を使う必要があります。存在しないファイルで使用すると、Require()は致命的なエラーを生成し、スクリプトを終了するので、die()は実行されません。 Include()は警告をスローするだけで、スクリプトは続行されます。

0
追加された
あなたの答えは、特定のPHPバージョンに固有のものか、特定の php.ini 設定に固有のものです。私の設定(PHP 5.5.4)の設定で、 require include に変更すると、全く違いはありません。どちらも私が捕まえられない醜い致命的なエラーを投げている。
追加された 著者 trejder,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com