PHPのError,Warningを非表示にする
このブログ「MISLEAD」も含めてですが、僕はプライベートでサイトを立ち上げる時はWordPressを利用することが多いです。
サイトごとに画面設計をしているので、細かい部分まで実現しようとすると取得できるテーマのままでは対応できません。
そのため、独自テーマを作るべく、元PHPエンジニアの経験を生かしてガリガリプログラムを書いています。
そんなある日、とあるサイトで外部のAPIと連携するサイトにて、どうやらAPIがうまく動かない時にPHPのWarningが表示されていることに気がつきました。
Warnigの原因を取り除くことはもちろんですが、公開後の運用を開始しているサイトで表示されているのはみっともないので、利用者を不安にさせないためにもなんとかしないといけません。
この事象を解決するべく、PHPでエラーを表示してくれる関数とエラー情報について調べたので、本日はこちらを紹介したいと思います。
事象の確認
対応する前の状態を確認しましょう。
まず、前置きですがエラーには、主にError、Warning、Noticeといったものがあります。ここではひっくるめてエラーと呼んでますのでご注意ください。
では、エラー時の表示に参ります。
以下の画面キャプチャのとおり、エラーの文字列が表示されます。
(なお、このWarningはセッション開始より前に、別の処理を実行していることが原因です)
今でも、メンテが行き届いていない古いサイトなどでたまに見かけたりすると思いますがちょっとまずいですよね。
何も知らないユーザからしてみれば、「自分のパソコンがおかしくなったのかも」なんて誤解を与えかねません。
もちろん、WarningにしろErrorにしろ開発中に表示されるのは問題ありません。
ところが、外部から提供されているAPI側に問題があったりするとこちらでは防ぎようがありません。
そもそもはエラーハンドリングをしっかり考慮していないことが原因なのですが、全てをもれなくとなるとそれだけ時間もかかってしまいます。
自サイトのサービスということもあり今回は
エラーを一切表示させない
という方向で行くことにしました。
対応方法
とても簡単です。
header.phpやfunctions.phpなど全ページ共通のインクルードファイルのどこかに
error_reporting(0);
と書くだけです。
すると、以下の画面のとおりエラーが表示されなくなりました。
ただ、これはWarningだけでなくerrorも全て表示されなくなります。
もし、一部は表示させておきたいなど細かい指定をしたい場合は以下を参考にしてください。
定数 | 値 | 説明 |
---|---|---|
– | -1 | エラーをすべて表示する |
– | 0 | エラーをすべて非表示にする |
E_ERROR | 1 | 重大な実行時エラー。 スクリプトの実行は中断されます。 |
E_WARNING | 2 | 実行時の警告(致命的エラーではない) |
E_PARSE | 4 | コンパイル時のパースエラー |
E_NOTICE | 8 | 実行時の警告 ※デフォルト設定では出力されない。 |
E_CORE_ERROR | 16 | PHPの開始時点での致命的エラー。 PHPのコアから発行される点がE_ERRORと異なる。 |
E_CORE_WARNING | 32 | PHPの開始時点での警告。(致命的エラーではない) PHPのコアから発行される点がE_WARNINGと異なる。 |
E_COMPILE_ERROR | 64 | コンパイル時の致命的エラー。 Zendスクリプティングエンジンに発行される点がE_ERRORと異なる |
E_COMPILE_WARNING | 128 | コンパイル時の警告(致命的エラーではない) Zendスクリプティングエンジンに発行される点がE_ERRORと異なる。 |
E_USER_ERROR | 256 | ユーザーが発行するエラー PHPコード上でtrigger_error()を使用した場合に発行される点がE_ERRORと異なる。 |
E_USER_WARNING | 512 | ユーザーが発行する警告 PHPコード上でtrigger_error()を使用した場合に発行される点がE_WARNINGと異なる。 |
E_USER_WARNING | 1024 | ユーザーが発行する注意 PHPコード上でtrigger_error()を使用した場合に発行される点がE_NOTICEと異なる。 |
E_ALL | 2047 | E_STRICT以外の全てのエラーメッセージ |
E_STRICT | 2048 | 実行時の注意(非推奨関数を使用した場合に発行される) ※デフォルト設定では出力されない。 |
定数も値もどちらの指定でも同じ結果が得られるので問題ありません。
ただし、全部表示・全部非表示は定数がないので、そちらを利用したい場合は値を指定するようにしましょう。
最後に
そもそもは僕のエラーハンドリングが甘いことが原因なので、次に生かすために定めたルールがあります。
サイトの公開直前にPHPのWarning非表示対応をすること
サイト構築中は、原因特定のヒントとして表示されてていいわけなので、このルールを適用することで運用開始後に「レベル低っ!」と思われることは避けられるかと思います。
コメント一覧
コメントはありません