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内の設定を変えることでログ出力の方法を変えていく。