PCは精密機器なので環境によって壊れる場合もあれば、内部のプログラムによる致命的なエラーで破壊される可能性もあります。
今回はPHPのプログラム内で起こる致命的なエラー=fatal errorについて、対処方法やエラーの種類までご紹介します。
エラーに関して種類と共に対処方法を学ぶことで、内部からPCが破壊されることなどを防ぐことができるので学んでおくのがおすすめです。
目次
fatal errorとは致命的なエラーのこと
fatal errorとはプログラムの処理が停止してしまうほどの重大なエラーのことを指します。
phpにはfatal errorを含めて数種類のエラーがあるのですが、その中でも一番重いのがfatal errorです。
処理が停止してしまうほどのものなので、今すぐ対応する必要があります。
エラーの中には無視しても問題ないものもありますが、そういった軽いエラーとは違います。
エラーを取り除くにはエラーメッセージを読み解くこと
処理が止まるほどのエラーとなるfatal errorですが、原因としては存在しない関数を呼び出していたりユーザー定義関数を二重に定義していたりなどです。
例えば以下のようなプログラムを記述して実行してみます。
1 2 3 4 5 6 |
function sample(){ return TRUE; } function sample(){ return TRUE; } |
すると結果は以下のように表示されます。
1 |
Fatal error:Cannot redeclare test()(previously declared in test.php:3)in test.php on line 6 |
ユーザーが定義した関数「sample」が二回定義されたためfatal errorとして、エラーが表示されています。
このようにエラーが出た場合は、英語ではありますがメッセージが出てきます。
またエラーの原因となっている部分周辺の行数も表示してくれます。
エラー内容の英語を読み解きつつ、指定されている行数周辺のプログラムを確認すると、エラーの原因が特定しやすいです。
![](https://webukatu.com/wordpress/wp-content/uploads/2020/08/error-520x300.jpg)
fatal errorを含めてエラーは全部で4種類
PHPのエラーは先ほど紹介したfatal errorを含めて以下の4種類あります。
- ・fatal error(致命的なエラー)
- ・Parse error(構文エラー)
- ・Warning(警告)
- ・Notice(注意)
上記は上に行けば行くほど重要なエラーとなっています。
ここからはfatal error以外のエラーはどういったものなのかを順番に紹介していきます。
![](https://webukatu.com/wordpress/wp-content/uploads/2020/07/0731-520x300.jpg)
Parse error(構文エラー)
Parse errorはPHPの文法に間違いが会った場合に表示されるエラーです。
こういった構文エラーは初心者が特にハマりやすいです。
1 |
echo ('Tank you';) |
上記のプログラムを実行すると、以下のようなParse errorが表示されます。
1 |
Parse error: syntax error, unexpected ';' in /workspace/Main.php on line 4 |
これはプログラム内の「;」が予期しない場所にあるとエラーメッセージで表示されています。
プログラムの方をよく見ると「;」が「)」の外ではなく中にありますね。
Warning(警告)とNotice(注意)
Warningは警告、Noticeは注意を表すエラーです。
これら2つは先に紹介したfatal errorやParse errorと比べて軽微なものになります。
そのためこれらが表示されたとしてもプログラムは最後まで実行されます。
Warningはファイルの呼び出しなどを実行した際、ファイルが存在していなかったりすると表示されます。
Noticeは以下のような定義されていない変数を使用したりすると表示されます。
1 2 3 4 5 |
if($n < 12){ echo('12より小さい'); }else{ echo('12より大きい'); } |
上記を実行すると以下のようにエラーが表示されます。
1 |
Notice: Undefined variable: n in /workspace/Main.php on line 4 |
定義されていない変数nを使おうとしていると注意されています。
Noticeは表示させないようにすることができる
前項で記載した通りNoticeぐらいのエラーであれば、プログラムは最後まで処理を続けることが可能です。
プログラムを組んでいる側としてもNoticeエラーならば、修正しないで使いたいこともあります。ただページを見に来た人にエラーが見えてしまうのはあまり良くはありませんね。
そこでここからは、Noticeエラーが出ても画面上に表示させないようにする2つの方法をご紹介します。
php.iniまたは.htaccessで設定する
1つは外部ファイルとなるphp.iniまたは.htaccessのいずれかをいじって非表示にする方法です。
まずphp.iniの場合はerror_reportingの項目に以下のように記載します。
1 |
error_reporting = E_ALL & ~E_NOTICE |
.htaccessの場合は以下を定義します。
1 |
php_value error_reporting 30711 |
このように外部ファイルでエラーの表示に関して設定することができます。
対象となるphpファイルで直接設定する
もう一つは外部ファイルではなく対象のPHPファイルで直接定義する方法です。
対象となるPHPファイル内でphp宣言している直下ぐらいに以下を記述します。
1 |
error_reporting(E_ALL & ~E_NOTICE); |
大体は前項の外部ファイルに記述することが多いのですが、外部ファイルがいじれない場合にこの方法をとるパターンが多いです。
定義の内容によってはNoticeだけでなく、fatal errorの非表示までできてしまうので、間違えないようにしたいですね。
![](https://webukatu.com/wordpress/wp-content/uploads/2021/02/error_reportingを-利用したエラー出力の-設定方法を徹底解説-520x300.jpg)
fatal errorが発生した際に関数を使ってログの作成が可能
fatal errorは処理が停止するほどのエラーであるため、発生した直後にプログラムの処理が止まってしまいます。
そのためphp内での処理でエラー内容を補足することができないのですが、register_shutdown_function関数を使えば補足することができます。
対象のphp内にregister_shutdown_function関数を使って以下のように記述すれば、エラーの内容をログとして表示させることが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
register_shutdown_function('error_log'); $test = new Test(); function error_log(){ $error = error_get_last(); if(empty($error)) return; switch($error['type']){ case(E_ERROR): $type = "Fatl Error"; break; case(E_WARNING): $type = "Warning"; break; case(E_NOTICE): $type = "Notice"; break; default: $type = "Error"; } $date = new DateTime(); $line = sprintf("%s: %s. %s in %s on line %s\n", $date->format('Y-m-d H:i:s'), $type, $error['message'], $error['file'], $error['line']); file_put_contents(dirname(_FILE_) . "/log.txt", $line, FILE_APPEND | LOCK_EX); } |
error_get_last関数で最後に発生したエラーを取得して、それを整形してログファイルに追記するよう処理しています。
まとめ
今回は致命的なエラーであるfatal errorについて、エラーの種類とともに紹介しました。
エラーと言っても種類によって重要度が異なっており、一番下のNoticeぐらいなら無視しても大丈夫です。
ただNoticeが原因でバグが出ている可能性があるため、何かしらエラーが出た場合はNoticeにも注意してくださいね。