Hatena::ブログ(Diary)

Nubilumの日記 このページをアンテナに追加 RSSフィード Twitter

2011-07-10

PHPのFatal Errorを強制的にExceptionにする魔改造パッチ

GitHubに公開しました。

https://github.com/nubilum/PHP-fatal-error-patch


やってることはすげー簡単で、zend.cファイル内の最終的なエラーハンドリング処理がまとまっている関数内の処理を書き換えただけ。

下記のようなエラーをハンドリングできます。


関数ないエラー

<?php

	try {
		test();
	}catch (Exception $e) {
		echo "catch!\n";
		echo get_class($e) . " " . $e->getMessage() . " " . $e->getTraceAsString();
	}

・出力結果

catch!
Exception Fatal Error occured #0 /Users/***********/Documents/PHP/error.php(4): unknown()
#1 {main}********:php-5.3.6_2 **********$ ./sapi/cli/php /Users/********/Documents/PHP/error.php 


で、以下がダメなパターン。


◯メモリオーバー

<?php

	try {
                echo "処理開始";
		test();
                echo "処理終了";
	}catch (Exception $e) {
		echo "catch!\n";
		echo get_class($e) . " " . $e->getMessage() . " " . $e->getTraceAsString();
	}
	
	function test(){

		$aaa = "";
		for ($i = 0; $i < 1000000; $i++) {
			$aaa .= "aaaaaaaaaaaa";
		}
	}

◯出力結果

処理開始
//正常に終わらないし、catchもされない


まあこっちの問題については、どのみちcatchした後にも同じ分だけメモリ取ってたらまたエラーになって死ぬとかそういう問題があるので、そのへんはもちっとガチの対応が要りそうですね。

あとエラーメッセージ例外処理に渡してないので常に固定メッセージ。

需要ありそうならおいおい直していきます。