ファイル・入出力

PHPエラーログの基本設定と活用方法について解説

PHPのエラーログは、プログラム実行中に発生したエラーの詳細を記録する仕組みです。

ログに記録された情報を確認することで、問題箇所の特定や修正作業の効率化を図ることができます。

本記事では、PHPエラーログの基本設定や活用方法について解説します。

エラーログ設定項目の確認

このセクションでは、PHPのエラーログの設定方法について、php.iniでの設定と実行時の動的な設定方法を中心に説明します。

php.iniでのパラメーター調整

PHPの挙動は、php.iniに記述するパラメーターによって基本的に決定されます。

ここでは、エラーログ出力に関係する主要な設定項目について詳しく見ていきます。

error_reportingの指定方法

PHPがどのレベルのエラーを報告するかは、error_reportingで指定します。

例えば、すべてのエラーを表示させたい場合、php.iniでは以下のように設定することができます。

; すべてのエラーと警告を報告する設定例
error_reporting = E_ALL

この設定により、PHPは生成されるすべてのエラー、警告、通知を報告するようになります。

開発段階では詳細なエラー情報が必要なため、この設定は非常に有用です。

log_errorsとdisplay_errorsの使い分け

エラーの報告先として、画面に表示するかログに記録するかを切り替えるために、display_errorslog_errorsが用いられます。

  • display_errorsは、実行時にエラーを画面上に出力する役割があります。
  • log_errorsは、エラーログファイルにエラーを記録するための設定です。

通常、開発環境ではdisplay_errorsをオンにし、本番環境ではオフにし、代わりにlog_errorsをオンにすることでエラー情報を記録します。

例えば、php.iniファイルでは以下のように設定できます。

; エラーをログに記録し、画面には表示しない設定例(本番環境向け)
display_errors = Off
log_errors = On

error_logの出力先設定

エラーログの出力先となるファイルは、error_logで設定します。

適切なディレクトリとファイル名を指定することで、後からログを確認しやすくなります。

以下はその設定例です。

; エラーログを特定のファイルに出力する設定例
error_log = /var/log/php_errors.log

この例では、サーバー上の/var/log/ディレクトリにあるphp_errors.logファイルにエラーが記録されます。

ファイルパーミッションやディレクトリの存在も確認しておく必要があります。

実行時の動的設定

実行時に設定内容を変更することで、プログラムの動作中にエラーログ出力の挙動を切り替えることができます。

これは、php.iniの設定が変更できない状況や、一時的に動作をテストする場合に役立ちます。

ini_setによる変更方法

ini_set()関数を用いることで、プログラムの実行中にphp.iniの設定を上書きすることが可能です。

以下に、エラー報告レベルを変更する例を示します。

<?php
// 現在のエラー報告設定を変更する
ini_set('error_reporting', E_ALL);
// エラーをログ出力にするための設定(画面には表示しない)
ini_set('display_errors', '0');
ini_set('log_errors', '1');
// サンプル処理でエラーを発生させる
// 故意に未定義の変数を使用してエラーを発生させています
echo $undefinedVariable;
?>
Warning: Undefined variable $undefinedVariable in /path/to/sample.php on line 8

上記の出力例は、display_errorsが有効な場合の例です。

display_errorsがオフの場合は画面にエラーが表示されず、ログファイルに記録されます。

設定値の反映確認

変更した設定が正しく反映されているか確認するために、ini_get()関数を用いると便利です。

以下は、実行時に設定値を確認するサンプルです。

<?php
// 現在のerror_reportingの設定値を取得し表示する
$currentErrorReporting = ini_get('error_reporting');
echo "Current error_reporting: " . $currentErrorReporting;
?>
Current error_reporting: 32767

この出力例は、E_ALLが整数値32767として設定されている場合の例です。

サーバー環境により数値が異なることに留意してください。

ログファイルの運用管理

エラーログが正しく出力された後は、ログファイル自体の管理が重要になります。

ここでは、ファイルの保存先やパーミッション、ログ内容の確認方法について説明します。

保存先とファイルパーミッション

ログファイルの保存先は、php.iniで設定されたerror_logで指定されたディレクトリとなります。

ここで、ログファイルに対するアクセス権限の設定も非常に重要となります。

ログディレクトリの指定方法

php.iniのerror_logパラメーターで、ログの出力先となるディレクトリやファイル名を指定します。

以下の例は、ログファイルを特定のディレクトリに出力する方法を示しています。

; 出力先を指定する例
error_log = /var/log/php/php_error.log

事前に指定したディレクトリが存在すること、またPHPから書き込み可能な状態であることを確認してください。

ファイル書き込み権限の設定

ログファイルおよびログディレクトリは、適切なパーミッションが設定されていない場合、エラーが発生することがあります。

UNIX環境では、一般的に以下のコマンドでパーミッションを設定します。

# ディレクトリのパーミッションを755に設定

chmod 755 /var/log/php

# ファイルのパーミッションを644に設定

chmod 644 /var/log/php/php_error.log

これにより、PHPがログファイルに書き込む際に必要な権限が確保されやすくなります。

ログ内容の確認手法

実際に出力されたエラーログを確認することで、システムの不具合や問題箇所の特定につながります。

ここでは、エラーメッセージのフォーマットやエラー種別の識別方法について説明します。

エラーメッセージのフォーマット

エラーメッセージは、通常タイムスタンプ、エラー種別、エラーメッセージ内容、発生ファイルと行番号といった情報が記録されます。

例えば、以下のような形式で出力されます。

[26-Apr-2023 15:45:23 UTC] PHP Warning:  Undefined variable $sample in /path/to/file.php on line 12

このようなフォーマットにより、エラーの発生時刻と内容が一目で分かるようになっています。

各エラー種別の識別法

エラーメッセージには、エラーの種類に応じたキーワードが含まれています。

たとえば、「Notice」「Warning」「Error」などが代表的なエラー種別です。

これらを参考に、ログをフィルタリングすることで、特定の種類のエラーのみを抽出することが可能です。

たとえば、Linuxのコマンドラインで「grep」を用いて警告のみを抽出する場合、以下のように実施できます。

grep "PHP Warning" /var/log/php/php_error.log

このようにすることで、特定のエラー種別に注目したログ解析が可能となります。

トラブルシューティング

エラーログが出力されない場合や、異常な内容になった場合、原因の特定は迅速な対応に直結します。

次の項目では、エラーが出力されないケースや、エラーメッセージから原因を推察する方法について説明します。

ログが出力されない場合の検証

エラーログが期待通りに出力されない場合、まずは設定ファイルとファイルシステムの状態を確認する必要があります。

php.ini設定の再確認

まず、php.iniの設定値が正しく反映されているかを確認してください。

以下の点を見直すと良いでしょう。

  • display_errorsがOffになっているか(本番環境の場合)。
  • log_errorsがOnになっているか。
  • error_logで指定されたパスが正しく、存在しているか。

また、設定を変更した後は、Webサーバーの再起動が必要になる場合があります。

変更内容が反映されているか、phpinfo()関数で確認してください。

ファイルパーミッションの見直し

ログファイルが書き込めない場合は、ディレクトリやファイルのパーミッションが原因のことが多いです。

前述の通り、書き込み可能なディレクトリやログファイルのパーミッションに問題がないか確認してください。

特にSELinux等のセキュリティ設定が有効な環境では、追加の設定が必要となることがあります。

異常ログ内容からの原因特定

ログファイルから原因を特定する作業は、エラーコードやメッセージの内容に基づいて行います。

ここでは、エラーコードによる判別と具体例を用いた調査方法を紹介します。

エラーコードによる判別

PHPのエラーメッセージには、エラーコードが含まれている場合があります。

例えば、以下のようなログが出力された場合、

[26-Apr-2023 15:45:23 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function doSomething() in /path/to/file.php:22

この場合、「Fatal error」に注目し、関数が存在しないことが原因です。

エラーコードやメッセージを手掛かりに、ソースコードの該当箇所を調査してください。

具体例をもとにした調査方法

具体的な例をもとに調査する場合、以下の手順が有効です。

  1. エラーメッセージ内のファイルパスと行番号を確認します。
  2. 該当するソースコードを開き、エラーが発生している部分を特定します。
  3. コード内で使用されている関数や変数、呼び出しが正しいか確認します。

以下は、エラーの原因を追跡するサンプルコードです。

<?php
// サンプル関数の呼び出し
// 存在しない関数 doSomething() を呼び出すことでエラーが発生するサンプル
doSomething();
// エラー発生箇所をログに残すためのコメント付き
error_log("doSomething()が呼び出されましたが、定義がありません。確認が必要です。");
?>
PHP Fatal error:  Uncaught Error: Call to undefined function doSomething() in /path/to/sample.php:3

このように、エラーの発生箇所を明確にし、具体的なエラーメッセージから問題を切り分けることが有用です。

また、エラーログが蓄積された場合、過去のログと照らし合わせることで、同様のエラーが繰り返し発生しているかどうかも判断でき、原因の特定に役立ちます。

まとめ

この記事では、PHPのエラーログの設定と管理、トラブルシューティングの手法について詳しく解説しました。

PHPにおけるphp.iniの設定やini_setによる動的な変更、ログファイルのパーミッション管理やエラー内容の識別方法など、実践的な知識が整理されました。

得た知識を活かし、環境設定とログ管理の見直しにぜひ取り組んでみましょう。

関連記事

Back to top button
目次へ