[PHP] Fatal及びNotice,、Warningメッセージ処理する方法


Study / PHP    作成日付 : 2020/01/19 03:00:00   修正日付 : 2020/01/22 20:37:23

こんにちは。明月です。


プログラムを開発する時に様々なエラーが発生することがあります。それでtry〜catchを利用してエラー処理をしますが、開発する時に全てのユーザケースを考えることも大変だし、try~catchでも処理ができなくPHP側のエラーが発生する時があります。

例えば、ページincludeやrequireする時ですね。

また、PHPはエラーではなくてもwarningやnoticeメッセージが出る時もあります。

<?php
  $data = 1/0;
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>	
<body>
  <?=$data1?>
</body>
</html>



上の例は1から0で割り算をするとエラーが発生することと$data1の場合はデータ宣言もしなかったのに出力しようと実装したから発生したメッセージです。

(上と下の結果の差はxDebugを設定したかどうかの差です。)

link - PHPでxDebugを設定する方法


開発中でエラーが発生するとエラーメッセージが出るのは当たり前ですが、サービスのproduction(本番)でエラーの詳細情報がでるのはNGですね。エラーメッセージだけではなく、NoticeやWaringもNGですね。

そのメッセージが画面上で表示されないような方法です。


php.iniで設定する方法

php.iniファイルをメモ帳で開くとerror_reportの領域があり、E_ALLで設定されています。E_ALLの意味は全てもメッセージを表示する設定です。

エラーレベル 説明
E_ALL すべてのメッセージと警告
E_ERROR 致命的なエラー
E_RECOVERABLE_ERROR ほぼ全てエラー
E_WARNING 警告
E_PARSE コンパイル単位のエラーPHPのDLLの関数のエラー
E_NOTICE Noticeレベルのメッセージ
E_STRICT Noticeレベルのメッセージ、PHPの以前バージョンの関数で新バージョンのおすすめ(?)のメッセージ
E_CORE_ERROR PHP起動エラー
E_CORE_WARNING PHP起動警告
E_COMPILE_ERROR コンパイル単位のエラー
E_COMPILE_WARNING コンパイル単位の警告
E_USER_ERROR ユーザエラー(サーバ内の権限関係)
E_USER_WARNING ユーザ警告(サーバ内の権限関係)
E_USER_NOTICE ユーザNotice(サーバ内の権限関係)
E_DEPRECATED 現在バージョンで使わない関数エラー
E_USER_DEPRECATED 現在バージョンで使わないユーザエラー


ここで全てのメッセージがでないようにするのは「0」を入力したらよいです。



でも仕様によって違いますが、Noticeだけ表示しないようにするとビット演算子を使って「E_ALL & ~E_NOTICE」で入力したらよいです。


全てのメッセージは出るけどNoticeは出ないという意味です。



PHPページでメッセージを設定する方法

PHPファイルの上の部分でerror_reporting関数を利用して設定できます。

<?php
  // 上のエラーレベルの設定ですべてのメッセージで警告だけ除く。
  error_reporting(E_ALL&~E_WARNING);
  $data = 1/0;
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
  <?=$data1?>
</body>
</html>


参考にエラーページに設定するのは全てのページに設定しべきです。

最新投稿