CodeIgniter3のエラーハンドリングの仕組みについてまとめる
CodeIgniter3を使っていると、エラーハンドリングが直感に反する処理をしていたので、エラーハンドリングのポイント、つまづいた部分をまとめていく。
開発環境
- CodeIgniter 3.1
- PHP 7.4.2
CodeIgniterのエラーハンドリングの仕組み
開発、本番、テスト環境でのエラーハンドリングの違い
CodeIgniterのデフォルトの設定では、開発環境、本番環境、テスト環境によって処理を変えている。
「CodeIgniter/index.php at develop · bcit-ci/CodeIgniter」を見ると分かるように、開発環境ではini_set('display_errors', 1);
で画面にエラー文が表示され、本番環境、テスト環境では画面出力されないようになっている。
また、開発環境の方は全てのエラー文が表示されるが、本番・テスト環境では以下のようにエラー文が設定されている。
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
ログファイルの出力の仕組み
CodeIgniterでログをファイルに出力したい場合は、application/config/config.php
内にある$config['log_threshold']
の設定を変えれば良い。
デフォルトでは
<?php
$config['log_threshold'] = 0;
となっておりログファイルの出力はされない設定になっている。ログファイルを出力したい場合は、上記の0
を以下のいずれかに変える。
0 = ログを出力しない
1 = エラーメッセージ(PHP自体のエラーも含む)
2 = デバッグメッセージ
3 = Info メッセージ
4 = 全てのメッセージ
ログファイルはデフォルトでapplication/logs/
に出力されるがapplication/config/config.php
にある$config['log_path'] = '';
の部分を変更することで、好きな場所にログファイルを出力できる。
例えば、$config['log_path'] = '/var/log/';
とすれば、よく使われるログディレクトリに出力できる。
好きなタイミングでログを出力したい時
自分の好きなタイミングでログを出力したい場合は、log_message()
関数を使えば良い。
参考:エラー処理 — CodeIgniter 3.2.0-dev ドキュメント
<?php
log_message('error', 'Some variable did not contain a value.');
log_message('debug', 'Some variable was correctly set');
log_message('info', 'The purpose of some variable is to provide some value.');
第1引数にはログのレベル、第2引数にはログのメッセージを書く。ログのレベルは、
- error
- debug
- info
の3種類を選べる。
エラーハンドリングで引っかかるポイント集
以下は、エラーハンドリングでつまづきやすいポイントをまとめていく。
正しく設定をしたのにログファイルが出力されない
設定が正しいのにログファイルが出力されない場合は、ディレクトリのパーミッションが正しいかを疑った方が良い。
例えば、application/logs
にログを出力するとする。その時、application/logs
のパーミッションが0755になっており、かつ所有者がログを書き込むユーザーになっているかをチェックする。
もし、使用しているwebサーバーがapacheの場合は、application/logs
のユーザーがapacheにする。
sudo chown -R apache:apache application/logs
php.iniで設定した通りにログが出力されない
ネットの記事を読むと、「ログが出力されない時はphp.iniを変更したら良いよ」という内容をよく見るが、CodeIgniterではphp.iniの設定は反映されない。
なぜなら、CodeIgniterのログ出力の時に使われるlog_message()
関数ではerror_log
を使わずに、Log
クラスを呼び出し、愚直にfopen()
からログを出力しているからだ。
参考:CodeIgniter/Log.php at develop · bcit-ci/CodeIgniter
なので、CodeIgniterではapplication/config/config.php
内の設定を変えることでログ出力の方法を変えていく。