特定のファイルのコードを必要とするスクリプトをPHP5で書いています。ファイルを含めることができない場合、最初に警告がスローされ、次に致命的なエラーがスローされます。コードを含めることができなかったときに、独自のエラーメッセージを出力したいと思います。 requeireが機能しなかった場合、最後の1つのコマンドを実行することは可能ですか?以下は機能しませんでした:
_require('fileERROR.php5') or die("Unable to load configuration file.");
_
error_reporting(0)
を使用してすべてのエラーメッセージを抑制すると、白い画面が表示されるだけで、error_reportingを使用しないと、PHPエラーが表示されます。これは表示したくありません。
これは、 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
}
?>
'file_exists()'を使用するだけです:
if (file_exists("must_have.php")) {
require "must_have.php";
}
else {
echo "Please try back in five minutes...\n";
}
より良いアプローチは、最初にパスで realpath を使用することです。ファイルが存在しない場合、realpath
はfalse
を返します。
$filename = realpath(getcwd() . "/fileERROR.php5");
$filename && return require($filename);
trigger_error("Could not find file {$filename}", E_USER_ERROR);
アプリの namespace に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");
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);
?>
私は提案を試していませんが、これは他の致命的なエラーシナリオで適切に使用される可能性があります。
Include()を使用する必要があります。 Require()を存在しないファイルで使用すると、致命的なエラーが発生してスクリプトが終了するため、die()は発生しません。 Include()は警告をスローするだけで、スクリプトは続行します。
私が使用している簡単な方法はそれです
<?php
...
if(!include 'config.php'){
die("File not found handler. >_<");
}
...
?>