こんにちは!エンジニアのノムラです。
PHPでは、エラーを制御したり、ログを出力するための便利な機能が用意されています。
この記事では、
【基礎】表示するエラーレベルの設定方法
【基礎】エラー内容を画面に表示する方法
【応用】ファイルにエラーログを出力する方法
といった内容について解説していきます。
エラーの表示やエラーログの出力の機能は、開発を進める中で必ず役に立つ機能です。
しっかりマスターしましょう!
エラーの表示・非表示を設定する
通常、プログラム実行中に発生したエラーはWebサーバのエラーログファイルに出力されます。
そのエラーをブラウザ上の画面で確認したい場合は、php.iniのdisplay_errorsの項目を設定する必要があります。
ここでは、php.iniから直接設定する方法と、ini_set関数でphp.iniの設定を行う方法について解説します。
php.iniによる設定
まずはphp.iniで直接設定する方法からみていきましょう。
php.iniの以下の項目を設定します。
変更前:
display_errors = OFF
変更後:
display_errors = ON
Webサーバーを再起動後、以下のプログラムを実行するとブラウザ上にエラーが出力されます。
<?php echo 'start<br>'; // エラー表示なし ini_set('display_errors', 1); $num1 = 100; $num2 = 200; echo '$num1 = '.$num1.'<br>'; echo '$num2 = '.num2.'<br>'; //$がついてないのでエラー echo 'end<br>'; ?>
このサンプルではnum2に$がついてないので、実行すると以下のようなエラーが出力されます。
実行結果:
start $num1 = 100 Notice: Use of undefined constant num2 - assumed 'num2' in /Applications/MAMP/htdocs/error.php on line 12 $num2 = num2 end
エラー内容が表示されていますね。
phpファイルによる設定
phpファイルの中でini_set関数を使用してdisplay_errorsを設定する方法もあります。
ini_set関数でdisplay_errorsのON/OFFを設定するには、以下のように記述します。
書き方:
// display_errorsをOFFに設定 ini_set('display_errors', 0); // display_errorsをONに設定 ini_set('display_errors', 1);
設定値は0:OFF、1:ONになります。
設定後、先ほどのサンプルを実行すると同様のエラーが発生します。
表示するエラーのレベルを設定する
PHPではエラーレベルを設定することで、出力するエラーの種類を指定することができます。
ここでは、php.iniから設定する方法と、error_reporting関数から設定する方法について解説します。
php.iniによる設定
php.iniの以下の項目を設定します。
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
値は整数かそれに割り当てられた定数名で指定します。
エラーレベル定数 | 機能 |
---|---|
E_ALL | サポートされている全てのエラーと警告 |
E_ERROR | 重大な実行時エラー |
E_WARNING | 実行時の警告(致命的ではない) |
E_PARSE | コンパイル時のパースエラー |
E_NOTICE | 実行時の警告(エラーが起こりうる状況時) |
E_DEPRECATED | 将来のバージョンでは動作しないコードについての警告 |
E_STRICT | 実行時の注意 |
定数名の前の「~」は否定を意味し、「E_ALL & ~E_DEPRECATED & ~E_STRICT」はE_DEPRECATEDとE_STRICT以外のすべてのエラーを出力することを意味します。
php.iniを設定したあとは、Webサーバーを再起動することで設定が有効になります。
phpファイルによる設定
php.iniは設定後、Webサーバーを再起動する必要がありますが、本番環境やレンタルサーバーで運用時にサーバーの再起動が難しい場合もあります。
そのような場合は、phpファイル内でerror_reporting関数を使用してエラーのレベルを設定する方法もあります。
書き方:
int error_reporting ([ int $レベル ] )
引数:
error_reportingのレベルを指定します。
php.iniのerror_reportingに指定できる値をビットマスクまたは定数で指定します。
返り値:
変更前のerror_reportingのレベルを返します。
記述例:
// エラーや警告を表示 error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); // 全てのエラーを表示 error_reporting(E_ALL);
エラーログ出力する
より詳しいエラーの原因を知るためには、エラーメッセージを出力することが有効です。
ここではerror_log関数を使用して、エラーメッセージを出力する方法を解説します。
error_log関数とは
指定したファイルやメールアドレスにエラーメッセージを出力・送信するには、error_log関数を使用します。
error_log関数は以下のように記述します。
書き方:
bool error_log( string $エラーメッセージ [, int $メッセージタイプ [, string $送信先 [, string $追加ヘッダ]]])
引数:
第一引数には出力するエラーメッセージを指定します。
第二引数にはメッセージタイプを指定します。
第三引数にはメッセージの送信先を指定します。
第四引数には追加のヘッダ(メッセージタイプが1の場合のみ)を指定します。
メッセージタイプ | 機能 |
---|---|
0 | php.iniの「error_log = 」に指定したファイルにメッセージを出力します。 |
1 | 第三引数に指定したアドレスに、電子メールによって送信されます。また、このタイプのみ第四引数に追加のヘッダを指定します。 |
2 | このオプションは現在では使用しません。 |
3 | 第三引数に指定したファイルにエラーメッセージを追加します。 |
4 | エラーメッセージをSAPIログ出力ハンドラに送信します。 |
返り値:
error_log関数は処理が成功した場合にTRUEを返し、失敗した場合はFALSEを返します。
error_log関数の使い方
ここでは、実際にerror_log関数の使い方を見ていきましょう。
以下に指定したURLを読み込み、処理が失敗した場合はログファイルにエラー内容を出力するサンプルを紹介します。
サンプルプログラム:
<?php //URLを指定する $url = 'https://www.sejuku.net/blog/blog/'; //URLの存在有無の確認 if (file_get_contents($url) != FALSE){ //URLを表示 echo file_get_contents($url); }else{ //エラーログを出力 error_log($url.'の読み込みに失敗しました。', 0); } ?>
実行結果(php_error.log):
https://www.sejuku.net/blog/blogの読み込みに失敗しました。
このサンプルでは存在しないURLを指定しているので、ファイルやURLを読み込むfile_get_contentsはFALSEを返します。
その為判定文ではelseの処理に入り、error_log関数の処理が実行されます。
error_log関数では第二引数のメッセージタイプを0で指定している為、php.iniの「error_log = パス/ファイル名」に指定したファイルにログが出力されます。
なお、サンプルで紹介したfile_get_contentsについては、以下の記事で詳しく解説しています!
指定したファイルに出力する
error_log関数は、php.iniで指定したファイル以外の他のファイルやメールアドレスにlogを出力することも可能です。
指定したファイルに出力するには、error_log関数のメッセージタイプ(第二引数)に3を指定し、第三引数に出力するファイルを指定します。
以下に指定したファイルにログを出力する方法を記述します。
サンプルプログラム:
<?php //URLを指定する $url = 'https://www.sejuku.net/blog/blog/'; //URLの存在有無の確認 if (file_get_contents($url) != FALSE){ //URLを表示 echo file_get_contents($url); }else{ /* エラーログを出力 */ //ファイルを指定 $log = '/Users/Shared/PHP/log/error.log'; // 時刻を指定 $log_time = date('Y-m-d H:i:s'); error_log('['.$log_time.'] '.$url.'の読み込みに失敗しました。'.PHP_EOL, 3, $log); } ?>
実行結果(error.log):
[2017-06-06 02:33:49] https://www.sejuku.net/blog/blog/の読み込みに失敗しました。
サンプルでは、URLの読み込み失敗時にerror_log関数のメッセージタイプを3に設定して、指定したファイルにログを出力しています。
エラーメッセージを出力するだけでは、いつ発生したエラーか分からないので、date関数を使用して発生時の時刻を出力しています。
また、エラーメッセージには改行コードが含まれないのでPHPの改行コードの定数「PHP_EOL」を指定しています。
date関数については、以下の記事で詳しく解説しています!
配列の内容を出力する
ログファイルに配列の内容を出力したい場合は、error_log関数のメッセージに配列を指定することで、ログファイルで内容を確認することができます。
以下にprint_rを使用して、error_log関数で配列の内容を確認する方法を記述します。
サンプルプログラム:
<?php // 配列を指定 $fruits = [0=>'apple', 1=>'orange', 2=>'apple', 3=>'orange', 4=>'banana']; //ファイルを指定 $log = '/Users/Shared/PHP/log/error.log'; // ログを出力 error_log(print_r($fruits, true), 3, $log); ?>
実行結果:
Array ( [0] => apple [1] => orange [2] => apple [3] => orange [4] => banana )
サンプルでは、配列の内容を出力するためにerror_logの第一引数にprint_rを使用して、配列の中身を取得しています。
指定したログファイルを確認すると、実行結果のように配列の中身が出力されていることがわかりますね!
まとめ
今回は
・エラーのレベルを設定する方法
・エラーを画面に表示する方法
・ファイルにエラーログを出力する方法
・error_log関数を使用して、指定したファイルにログを出力する方法
・error_log関数を使用して、配列の中身をログに出力する方法
などについて解説しました。
実際の開発において、デバッグやエラー内容を表示したり、ログに出力することはよくありますので、この機会に覚えておきましょう。
もし、エラーの制御や出力方法について忘れてしまったら、この記事を思い出してくださいね。