1つだけ過去を変えられるとしたら?

PHPでFetalなエラーが発生した場合
に、ApacheのErrorDocument 500で指定したメッセージを表示させたいのですが、上手くいきません。

■Apacheの設定
ErrorDocument 500 "The server made a boo boo."

■PHPの設定
error_reporting(6135); // 0にしてもダメでした
ini_set('display_errors', '1'); // 0にしてもダメでした

■PHPのコード
<?php
throw new Excpetopn('err!');
?>

ブラウザからアクセスすると、httpレスポンスコードは500が返ってきています。
ini_set('display_errors', '1'); にすると、
Fatal error: Uncaught exception 'Exception' with message

が表示されます。
逆に
ini_set('display_errors', '0'); にすると、
何も表示されません。


どうしたら、ErrorDocument 500で設定した"The server made a boo boo."が表示されるようになりますでしょ
うか。。
そもそも表示できないのでは?と思いはじめてますが。。


知っている方いましたら、ぜひともご教授下さい。
よろしくおねがいいたします。


Apache 2.2.3
PHP5.3.0

A 回答 (3件)

Fatal Error が発生するとすべての処理が停止し、そのスクリプト自体ではエラーの発生そのものさえキャッチできません。

やるなら、別ファイルから判定・処理するしかないかと。

参考:
http://jp2.php.net/manual/ja/function.set-error- …
特に「以下のエラータイプは、ユーザ定義の関数では扱えません~」のところ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

ApacheのErrorDocumentを表示はしてくれないのですかね?

とりあえず現状はset_error_handlerでキャッチして、エラー画面を出力してexitしています。

ユーザー定義関数ではE_ERROR, E_PARSEなどのエラーを扱えないとのことなので、

PHPはE_ERROR, E_PARSEなどのエラーが発生したら画面が真っ白(orエラー文)になるしかない。

という結論になりますね。。。

ありえない。。。


>やるなら、別ファイルから判定・処理するしかないかと。
すいません。私の力不足で想像できません。。。
もう少し詳しくお願いします。。!

お礼日時:2010/06/28 20:05

>PHPはE_ERROR, E_PARSEなどのエラーが発生したら画面が真っ白(orエラー文)になるしかない。


その通りだと。それを利用した1例としては、

display_errorsをOffにして
//http経由で結果取得
if($line=file_get_contents("http://監視するPHP")){
  echo $line;
}else{
  //ErrorDocument はファイルにして自力で出力
  //header('HTTP/1.0 500 Internal Server Error');
  include("500Error用.php");
}
またはわざとErrorを発生させるcgi等へ 飛ばす
//header("Location: http://500Error.cgi");
という手もあるでしょうが。

一応確認したところ動作はしましたが、いうまでもなく別スクリプトで当該phpを実行することになり、URI・サイト構成が変わってしまうため、事実上使えない…と思います。
>とりあえず現状はset_error_handlerでキャッチして~
私ならやはりこちらを使用します。(これで全てのエラーが取れると助かるんですけどね。)
    • good
    • 0

#Ano2追記です。


関数register_shutdown_function()とtry-catch で、致命的エラー後も処理を継続する例がありますね。参考になるかも知れません。
http://keicode.com/cgi/php-error-handling.php
    • good
    • 0
この回答へのお礼

なるほど!!!
この方法ならいけますね。!!
大変参考になりました。
ありがとうございました!!!!!!

お礼日時:2010/07/07 13:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!