web-dev-qa-db-ja.com

PHPでrequire()またはinclude()のエラーをキャッチする方法は?

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

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

error_reporting(0)を使用してすべてのエラーメッセージを抑制すると、白い画面が表示されるだけで、error_reportingを使用しないと、PHPエラーが表示されます。これは表示したくありません。

17
R_User

これは、 set_error_handlerErrorException と組み合わせて使用​​することで実現できます。

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
}
?>
17
Sjan Evardsson

'file_exists()'を使用するだけです:

if (file_exists("must_have.php")) {
    require "must_have.php";
}
else {
    echo "Please try back in five minutes...\n";
}
16

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

$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");
5
maček

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);
?> 

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

2
Repox

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

1
Ondra Koupil

私が使用している簡単な方法はそれです

<?php
    ...
    if(!include 'config.php'){
        die("File not found handler. >_<");
    }
   ...
?>
0
Prashant