関数内にファイルを含めob_start()
、ob_get_contents()
、 などを使用して出力をファイルに保存したい。
しかし、そのインクルード ファイルにエラーがある場合は、次のようにします。
私の関数がそれを認識し、それをキャプチャするために(それを適切に処理できるように)
エラーを出力しないようにするには
set_error_handler
これを許可しますか?
関数内にファイルを含めob_start()
、ob_get_contents()
、 などを使用して出力をファイルに保存したい。
しかし、そのインクルード ファイルにエラーがある場合は、次のようにします。
私の関数がそれを認識し、それをキャプチャするために(それを適切に処理できるように)
エラーを出力しないようにするには
set_error_handler
これを許可しますか?
(ほとんどの)非致命的なものについては、はい、set_error_handler
それらをキャッチでき、適切に処理できます。
致命的なエラーについては、次の質問に対する回答を参照してください: PHP : カスタム エラー ハンドラ - 解析と致命的なエラーの処理
単純な解析エラーを防ぐことに関心がある場合はrunkit_lint_file
、PHP インストール用の拡張機能をインストールできる場合は、runkit 拡張機能を使用できます。[補遺編集: つまり、ファイルをインクルードする前に lint します。解析エラーは回復できません。これは、コマンド ラインで -l オプションを使用して php を実行することによっても実行できます。ただし、ホストの設定方法によっては、コマンドライン php オプションが機能するように環境を変更する必要がある場合があります。]
これはコマンドラインphpの例ですが、良い例かどうかはわかりません. いくつかのコメントを追加して、私のプロジェクトの 1 つからリッピングしました。
/**
* Lint and and retrieve the result of a file. (If lint is possible)
* @param $file
* @return Mixed bool false on error, string on success.
*/
function lint_and_include ($file) {
if(is_readable($file)) {
//Unset everything except PATH.
//I do this to prevent CGI execution if we call
//a CGI version of PHP.
//Someone tell me if this is overkill please.
foreach($_ENV as $key=>$value)
{
if($key == "PATH") { continue; }
putenv($key);
}
$sfile = escapeshellarg($file);
$output = $ret = NULL;
//You could modify this to call mandatory includes to
//also catch stuff like redefined functions and the like.
//As it is here, it'll only catch syntax errors.
//You might also want to point it to the CLI php executable.
exec("php -l $sfile", $output, $return);
if($return == 0) {
//Lint Okay
ob_start();
include $file;
return ob_get_clean();
}
else {
return false;
}
}
else {
return false;
}
}
追記事項: この場合、set_error_handler
コールバックはエラーを出力するのではなく、どこかでキャッチできるエラーをログに記録する必要があります。含まれているコードのいずれかが例外をスローする可能性がある場合は、それらも try-catch ブロックでキャッチすることができます。