Created
April 5, 2011 07:30
-
-
Save koshiaaaaan/903173 to your computer and use it in GitHub Desktop.
Fatal error を set_error_handler で登録されたハンドラで捕捉する方法。
Parse error は捕捉できません。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// エラーの表示をオフ | |
ini_set('display_errors', 0); | |
// エラーは全て捕捉する | |
error_reporting(E_ALL); | |
// エラーハンドラを設定 | |
set_error_handler('my_error_handler'); | |
// エラー格納用グローバル変数 | |
$errors = array(); | |
// 出力バッファリングの有効化 | |
ob_start(); | |
// 自動フラッシュをオフ | |
ob_implicit_flush(false); | |
// 自作エラーハンドラ | |
function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { | |
global $errors; | |
// エラーレベルによって補則するエラーを判断する。 | |
if ((error_reporting() & $errno) === $errno) { | |
// エラーメッセージの作成 | |
$errors[] = "[$errno] $errstr $errfile($errline)\n"; | |
} | |
// エラーの表示をオフにしてるので意味なし。 | |
return true; | |
} | |
// shutdown処理の登録 | |
register_shutdown_function(function() { | |
global $errors; | |
// バッファの取得 | |
$ob = ob_get_clean(); | |
// シャットダウン前に起こったエラーを取得 | |
$error = error_get_last(); | |
// エラーがあれば自作のエラーハンドラを呼び出す | |
if (!empty($error)) { | |
if (my_error_handler( | |
$error['type'], | |
$error['message'], | |
$error['file'], | |
$error['line'], | |
null | |
)) { | |
// 返り値が true の時バッファから Fatal error の出力を消す必要あり。 | |
// が、これ xdebug とか入れてると出力方法が変わったりするので、難しい。 | |
} | |
} | |
// 本来 ob_get_contents と ob_flush とかでやるのが行儀のよい書き方なんだろうけども、 | |
// まぁ、サンプルなんで。 | |
if (!empty($ob)) { | |
echo $ob; | |
} | |
// 格納したエラーを出力 | |
foreach($errors as $error) { | |
echo $error; | |
} | |
}); | |
echo 'start'; | |
// 宣言していない変数をechoしてnotice | |
echo $test; | |
// 存在しないクラスを呼んでfatal errorを起こす | |
NotExsistsClass::hogehoge(); | |
echo 'end'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment