今だけ人気マンガ100円レンタル特集♪

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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#Ano2追記です。


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

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

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

>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

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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

Qpsqlコマンド接続によるパスワードについて

psqlコマンドでDBへの接続を行っております。

/usr/local/pgsql/bin/psql -U postgres -h xxx.xxx.xxx.xxx testdb

上記コマンドをコマンドラインから実行するとパスワードが聞かれます。
パスワード設定をmd5にしているためですが、
その設定を変更せずコマンドラインでパスワードを渡すなどしてパスワードの入力を促す処理をスルーしたいのですが全然出来ません。

どのなたかご存知の方、いらっしゃいましたらご教示の程お願い致します。

Aベストアンサー

PGPASSWORD=○○○ /usr/local/pgsql/bin/psql -U postgres -h xxx.xxx.xxx.xxx testdb

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qインストールされているディレクトリを知るコマンドはありませんか?

phpのconfigerをするのに、
phpのインストールされているパスへ移動しなくてはいけませんが、
phpがどこにインストールされているかわかりません。

 rpm -qf php-4.0.6-7

とすると

 エラー: ファイル php-4.0.6-7: そのようなファイルやディレクトリはありません

と表示されてしまうのです。
rpmのサイトを見てオプションを設定して表示された結果から
ディレクトリを移動しても
コンフィギャーできるところに辿り着きませんでした。

どうしたらインストールされているディレクトリを
知ることができるでしょうか?

OSは以下の通りです。
AIX Version 4 もしくは LASER5 Linux release 7.2

今月が納期で生じたバグ対応のため大変困っています。
質問場所が違っていたら申し訳ないですが、
よろしくお願いいたします。

Aベストアンサー

Laser5に限っての話ですが、標準のインストールでphpはインストールされるはずですが。

# rpm -qa | grep -i php

でphpのパッケージ名は表示されませんか?

findを実行した結果、

php(コマンド)
libphp4.so(ライブラリ)
php.ini(設定ファイル)

等も見つからないのでしょうか?
もしそうならphpはパッケージもソースでもインストールされていない可能性があります。

QApacheでhttp://localhost/が表示されない

Apacheバージョン2.0.50をインストールし、設定ファイルは一切変更していない状態でhttp://localhostと入力しても「あなたの予想に反して・・・」のページが表示されません。
何回かApacheの再インストールも試してみましたが変化がありません。
ローカルで動作確認するだけなので、インストールにあたってNetworkDomainなどのアドレスは「localhost」を入力しています。
何か原因を特定する方法はありませんでしょうか。
ちなみにOSはWindowsXPのHomeEditionです。

Aベストアンサー

(1) まずは、Apacheが起動しているか確認しましょう。
  これは管理ツールのサービス、Apache Server Monitorを見ればわかります。

(2) ポート番号80がLISTEN状態になっているか確認しましょう。
  これはnetstatコマンドで確認できます。

(3) パーソナルファイアウォールソフトをインストールしているなら、
  localhost:80 からの接続を許可しているか確認してみましょう。

(4) IISなど、他のwebサーバを同時に動かしていないか確認してみましょう。

(5) ブラウザでプロクシサーバを指定しているのでしたら、
  localhostはプロクシーを見ない、など設定してみてください。


ほかにもいろいろありますが、Apacheの設定の前に、これくらいは確認しましょう。

QApacheのアンインストール

Linuxにapacheをソースファイルからインストールしました。
しかし、諸事情により削除することになったのですが、
./configure
make uninstall
を実行してもアンインストールができませんでした。

調査したところ、
インストールディレクトリをリネームすればよいと
分かりましたがそれだけでよいのでしょうか?

Aベストアンサー

デフォルトインストールしたのであれば、
/usr/local/apache
にインストールされているはずなので、
このディレクトリごとバッサリと削除してしまっておしまいです。

ソースからインストールする場合はアンインストール方法がないと考えた方がいいと思います (アプリケーションのMakefileに依存)。従って、ディレクトリごと削除できるような場所にインストールすることをお勧めします。

QPHPでPostgresqlへアクセス

OSはFedoraCore3を使用しています。
PHP5で作成したプログラムでPostgresqlへアクセスするのですが,全く応答がありません。

ブラウザで表示後、ソースを見ると
<html><body></body></html>
としか出ません。
ということはpg_connect("host=****...")がエラーの原因と考えています。
上記のプログラムの上にecho"ああ"と入力すると、ソースには「ああ」と表示があります。

PHPでFTP接続のプログラムを作成して実行するとこれは問題なく動きます。

やはり,Postgresqlの設定がおかしいのでしょうか?それともアクセスの方法が間違っているのでしょうか?

ホント困っています。よろしくお願いします。

Aベストアンサー

>Call to undefined function pg_connect()

定義されていないpg_connectという関数が呼ばれてます(使われてます)って意味ですね。

PHPでのpostgresql操作用モジュールが入っていない可能性が高いです。
ちょっとパッケージ名がそのものズバリはFedoraのは分かりませんが、pgsql.soがインストールされていないか、pgsql.soを読み込む設定になっていないのでしょう。

pgsql.soがまずあるかどうか確認してください。
なければ、インストールしてください。
あった場合、またはインストールした場合、php.iniに
extension = pgsql.so
を追記してください。

その後、apacheを再起動するなりして、php.iniの変更を適用させてください


人気Q&Aランキング

おすすめ情報