PHPのエラーログを確認・出力する方法について

採用はこちら

PHPのエラーログとは、PHPの実行中に発生したエラーや警告、通知などを記録するための仕組みです。

PHPでWebサイトやWebアプリケーションを開発していると、画面が真っ白になったり、処理が途中で停止したり、期待した結果が得られなかったりすることがあります。

このような場合にエラーログを確認すると、どのファイルの何行目で、どのような問題が発生しているのかを特定しやすくなります。

PHPでは、エラーをブラウザ画面に表示する方法と、ログファイルへ記録する方法があります。

開発環境では画面表示が便利ですが、本番環境では内部情報が外部へ漏れる可能性があるため、エラーを画面へ表示せずログへ記録する運用が基本です。

目次

PHPのエラーを画面に表示する方法

PHPのエラーを確認するもっとも簡単な方法のひとつが、ブラウザ画面へ直接エラーを表示する方法です。

開発環境では、エラー内容をすぐに確認できるためデバッグしやすくなります。

PHPコードからエラー表示を有効にする

PHPコード内でエラー表示を有効にする場合は、次のように記述します。

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

error_reporting()は、どの種類のエラーを報告対象にするかを設定する関数です。

E_ALLを指定すると、PHPで報告可能なすべてのエラーレベルを対象にできます。

ini_set('display_errors', '1')は、PHPのエラーを画面に表示する設定です。

開発中は、基本的にE_ALLを指定して問題をできるだけ早く発見できる状態にしておくとよいでしょう。

ini_set()では表示できないエラーがある

注意したいのは、ini_set()はPHPスクリプトが実行されてから設定される点です。

たとえば、そのスクリプト自体に致命的な構文エラーがあり、ini_set()まで処理が到達しない場合は、エラー表示を有効にできません。

そのため、開発環境で確実にエラーを表示したい場合は、PHPコード内だけでなくphp.ini側でも設定しておく方が確実です。

php.iniでエラー表示を設定する方法

PHP全体のエラー表示設定を変更したい場合は、php.iniを編集します。

開発環境では、たとえば次のように設定できます。

error_reporting = E_ALL
display_errors = On
display_startup_errors = On

error_reporting

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

開発環境では、基本的に次の設定で問題ありません。

error_reporting = E_ALL

PHP 8.0以降ではE_ALLがデフォルトですが、設定内容を明確にするために明示的に指定しておくこともできます。

display_errors

display_errorsは、PHPのエラー内容を画面へ出力するかどうかを制御します。

開発環境では、次のように設定すると便利です。

display_errors = On

一方、本番環境ではセキュリティ上の理由からOffにするのが基本です。

display_startup_errors

display_startup_errorsは、通常のPHPスクリプトの実行エラーではなく、PHPの起動処理中に発生したエラーを表示するための設定です。

開発環境では、必要に応じて次のように設定します。

display_startup_errors = On

本番環境では、基本的にOffにします。

PHPのエラーをログファイルへ出力する方法

本番環境では、エラーを画面に表示するのではなくログファイルへ記録する方法が適しています。

代表的な設定は次のとおりです。

error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log

log_errorsを有効にする

log_errorsは、PHPで発生したエラーをログへ記録するかどうかを指定する設定です。

log_errors = On

本番環境では、display_errorsを無効にしてlog_errorsを有効にする構成が基本です。

つまり、エラーそのものを無視するのではなく、ユーザーには表示せず管理者がログから確認できるようにします。

error_logでログの出力先を指定する

error_logでは、PHPエラーの出力先を指定できます。

たとえば、次のように設定します。

error_log = /var/log/php/error.log

ただし、/var/log/php/error.logはあくまで一例です。

実際のログファイルの場所は、OS、PHPのインストール方法、Apache、Nginx、PHP-FPMなどの構成によって異なります。

そのため、ログが見つからない場合は、現在のPHP設定を確認する必要があります。

error_log()で任意のログを出力する方法

PHPには、任意のメッセージをログへ出力できるerror_log()関数があります。

アプリケーションの動作確認やデバッグにも便利です。

基本的な使い方

もっとも基本的な使い方は次のとおりです。

<?php

error_log('処理を開始しました');

このコードを実行すると、PHPで設定されているログ出力先へメッセージが記録されます。

変数の値をログへ出力する

変数の値を確認したい場合は、文字列としてerror_log()へ渡します。

<?php

$userId = 123;

error_log('userId: ' . $userId);

ログには、次のような内容が記録されます。

userId: 123

処理途中の値を確認したい場合に便利です。

配列をログへ出力する

配列をそのまま文字列連結することはできないため、print_r()などを利用します。

<?php

$user = [
    'id' => 123,
    'name' => 'Taro',
];

error_log(print_r($user, true));

print_r()の第2引数にtrueを指定すると、結果を画面へ表示するのではなく文字列として返せます。

そのため、配列の内容をerror_log()へ渡すことができます。

JSON形式でログを出力する

配列やオブジェクトをJSON形式へ変換してログへ記録する方法もあります。

<?php

$user = [
    'id' => 123,
    'name' => 'Taro',
];

error_log(
    json_encode($user, JSON_UNESCAPED_UNICODE)
);

ログを一定のフォーマットで保存したい場合には、JSON形式が便利です。

PHP 7.3以降では、必要に応じてJSON_THROW_ON_ERRORを利用してJSON変換時のエラーを例外として処理することもできます。

<?php

$json = json_encode(
    $user,
    JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR
);

error_log($json);

指定したファイルへログを出力する方法

error_log()では、出力先となるファイルを直接指定することもできます。

次のように記述します。

<?php

error_log(
    "ユーザー登録処理を開始しました\n",
    3,
    '/var/log/php/application.log'
);

第2引数に3を指定すると、第3引数で指定したファイルへメッセージを追記できます。

message_typeが3の場合は改行を付ける

error_log()message_type3を指定した場合、改行は自動的に付加されません。

そのため、1行ずつログを出力したい場合は、次のように\nを付けます。

error_log(
    "処理が完了しました\n",
    3,
    '/var/log/php/application.log'
);

Windows環境なども考慮する場合は、PHP_EOLを利用する方法もあります。

error_log(
    '処理が完了しました' . PHP_EOL,
    3,
    '/var/log/php/application.log'
);

現在のPHPエラーログ設定を確認する方法

エラーがログへ出力されない場合は、まず現在のPHP設定を確認することが重要です。

PHPではphpinfo()ini_get()を利用できます。

phpinfo()で設定を確認する

PHPの設定をまとめて確認したい場合は、次のコードを使用できます。

<?php

phpinfo();

ブラウザからアクセスすると、PHPの詳細な設定情報が表示されます。

特に確認したい項目は次のとおりです。

error_reporting
display_errors
display_startup_errors
log_errors
error_log

ただし、phpinfo()にはPHPのバージョンや設定ファイルの場所、モジュール構成、サーバー情報など多数の情報が表示されます。

本番環境で公開したままにするとセキュリティ上のリスクになるため、確認後は削除するのが適切です。

ini_get()で個別に確認する

必要な設定だけを確認したい場合は、ini_get()が便利です。

<?php

echo 'display_errors: ' . ini_get('display_errors') . PHP_EOL;
echo 'log_errors: ' . ini_get('log_errors') . PHP_EOL;
echo 'error_log: ' . ini_get('error_log') . PHP_EOL;

特にerror_logの設定を確認すれば、PHPがどのログファイルを使用する設定になっているか判断しやすくなります。

使用しているphp.iniを確認する方法

PHPの設定を変更したのに反映されない場合は、編集しているphp.iniが実際に読み込まれているものと一致しているか確認します。

php –iniで確認する

CLI環境では、次のコマンドを使用できます。

php --ini

読み込まれているphp.iniや追加の設定ファイルを確認できます。

CLIとWebでは設定が異なる場合がある

注意したいのは、コマンドラインから実行するPHPとWebサーバー経由で実行するPHPでは、異なる設定が使用されている場合があることです。

そのため、CLIで、

php --ini

と実行して確認した設定が、ApacheやNginx経由で使用されているPHP設定と必ず一致するとは限りません。

Web環境の設定については、phpinfo()などを利用して確認する方が確実です。

LinuxでPHPのエラーログを確認する方法

ログファイルの場所が分かっている場合は、Linuxコマンドを使って内容を確認できます。

catでログ全体を確認する

ログファイル全体を表示する場合は、catを使用します。

cat /var/log/php/error.log

ただし、ログファイルが大きい場合は大量の内容が表示されるため、確認しにくくなることがあります。

tailで最新のログを確認する

最新のログだけ確認したい場合は、tailが便利です。

tail /var/log/php/error.log

さらに、リアルタイムでログを監視したい場合は、次のようにします。

tail -f /var/log/php/error.log

PHPを実行しながらエラーを確認したいときに便利です。

grepで特定のエラーを検索する

特定の文字列を含むログだけ探したい場合は、grepを利用できます。

grep "Fatal error" /var/log/php/error.log

特定の日時、ファイル名、エラーメッセージなどで絞り込みたい場合にも利用できます。

ApacheやNginxのエラーログも確認する

PHPのエラーが必ずしもPHP専用のログファイルだけに出力されるとは限りません。

PHPの実行環境や設定によっては、ApacheやNginxなどWebサーバー側のログも確認する必要があります。

Apacheの場合

Apacheでは、環境によって次のようなログファイルが利用されることがあります。

/var/log/apache2/error.log

ただし、実際のパスはOSや設定によって異なります。

Nginxの場合

Nginxでは、次のようなログファイルが利用されることがあります。

/var/log/nginx/error.log

NginxとPHP-FPMを組み合わせている場合は、PHP-FPM側のログも確認します。

PHP-FPMのエラーログを確認する

NginxなどでPHP-FPMを利用している場合は、PHP-FPM独自のログ設定も確認する必要があります。

一般的な構成は次のようになります。

ブラウザ
    ↓
Nginx
    ↓
PHP-FPM
    ↓
PHPアプリケーション

この場合、障害の発生箇所によって確認するログが異なります。

PHPコードのエラー

PHPコード自体で発生したエラーは、PHPのエラーログを確認します。

PHP-FPMのプロセスエラー

PHP-FPMの起動失敗やワーカープロセスの問題などは、PHP-FPM側のログを確認します。

NginxとPHP-FPMの接続エラー

NginxからPHP-FPMへ接続できない場合は、Nginxのエラーログも確認します。

PHP-FPMにはcatch_workers_outputという設定もあり、ワーカープロセスの標準出力や標準エラー出力をPHP-FPMのメインエラーログへリダイレクトできます。

error_reporting()でエラーレベルを指定する方法

PHPでは、error_reporting()を使って報告するエラーの種類を制御できます。

すべてのエラーを対象にする

開発時は次の設定が基本です。

error_reporting(E_ALL);

できるだけすべての問題を検出することで、不具合を早い段階で発見できます。

特定のエラーを除外する

特定のエラーレベルだけ除外することもできます。

error_reporting(E_ALL & ~E_DEPRECATED);

この場合、E_DEPRECATEDを除外します。

ただし、開発中に警告や非推奨機能を安易に非表示にすると、将来的な問題を見逃す可能性があります。

原則として、開発環境ではE_ALLで確認するのがおすすめです。

set_error_handler()で独自のエラー処理を実装する

PHPではset_error_handler()を使って、独自のエラーハンドラーを登録できます。

たとえば、次のようにエラー情報をログへ保存できます。

<?php

set_error_handler(function (
    int $errno,
    string $errstr,
    string $errfile,
    int $errline
): bool {
    error_log(
        sprintf(
            '[PHP ERROR] %s in %s:%d',
            $errstr,
            $errfile,
            $errline
        )
    );

    return true;
});

set_error_handler()ではすべてのエラーを処理できない

set_error_handler()を利用すれば、すべてのPHPエラーを処理できるわけではありません。

たとえば、E_ERRORE_PARSEE_CORE_ERRORE_COMPILE_ERRORなど、一部のエラーはユーザー定義エラーハンドラーでは処理できません。

また、ハンドラーが登録される前に発生したエラーも処理できません。

trueとfalseの戻り値に注意する

set_error_handler()で登録した関数がtrueを返した場合、そのエラーについてPHP標準のエラーハンドラーは実行されません。

return true;

独自処理のあとにPHP標準のエラー処理も実行させたい場合は、falseを返します。

return false;

この違いを理解して利用することが重要です。

例外やErrorをログへ出力する方法

PHP 8系では、実行時に発生する問題の多くがThrowableとして扱われます。

そのため、set_error_handler()だけでなく、trycatchを使った例外処理も重要です。

tryとcatchでログを出力する

次のように記述できます。

<?php

try {
    // 例外が発生する可能性がある処理
} catch (Throwable $e) {
    error_log($e->getMessage());
}

より詳しい情報を記録したい場合は、ファイル名や行番号も出力できます。

<?php

try {
    // 処理
} catch (Throwable $e) {
    error_log(
        sprintf(
            '%s in %s:%d',
            $e->getMessage(),
            $e->getFile(),
            $e->getLine()
        )
    );
}

set_exception_handler()を利用する

未捕捉の例外をまとめて処理したい場合は、set_exception_handler()を利用できます。

<?php

set_exception_handler(function (Throwable $e): void {
    error_log(
        sprintf(
            '[UNCAUGHT EXCEPTION] %s in %s:%d',
            $e->getMessage(),
            $e->getFile(),
            $e->getLine()
        )
    );
});

大規模なアプリケーションでは、フレームワークの例外処理機構やログライブラリを利用する方法も一般的です。

PHPのエラーログが出力されない場合の確認ポイント

設定しているにもかかわらずエラーログが出力されない場合は、複数の原因が考えられます。

log_errorsが有効になっているか確認する

まず、次の設定になっているか確認します。

log_errors = On

error_reportingを確認する

エラーが報告対象から除外されていると、期待したログが出ない場合があります。

開発中は次の設定が基本です。

error_reporting = E_ALL

error_logの出力先を確認する

error_logで指定されているログファイルのパスを確認します。

<?php

var_dump(ini_get('error_log'));

ファイルやディレクトリの権限を確認する

PHPの実行ユーザーにログファイルやディレクトリへの書き込み権限がなければ、ログを保存できません。

Linux環境では、所有者やパーミッションも確認する必要があります。

php.iniが正しいか確認する

複数のPHPバージョンをインストールしている環境では、別のphp.iniを編集している可能性があります。

CLIとWebでも使用する設定が異なることがあるため注意が必要です。

ApacheやNginx、PHP-FPMのログを確認する

PHP側にログが見つからない場合は、WebサーバーやPHP-FPM側へ記録されている可能性があります。

PHPだけに限定せず、関連するログを横断的に確認することが重要です。

本番環境でおすすめのPHPエラー設定

本番環境では、PHPのエラー内容をユーザーのブラウザへ表示しないことが重要です。

代表的な設定例は次のとおりです。

error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

エラーを無視するのではなくログへ記録する

本番環境だからといって、error_reportingを無効にする必要はありません。

重要なのは、エラーを検出してログへ記録しながら、ユーザーには詳細を表示しないことです。

つまり、

error_reporting = E_ALL
display_errors = Off
log_errors = On

という考え方が基本になります。

開発環境と本番環境で設定を分ける

PHPのエラー設定は、開発環境と本番環境で分けるのがおすすめです。

開発環境の設定例

開発環境では、問題をすぐ確認できるよう画面表示とログ出力の両方を有効にします。

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On

本番環境の設定例

本番環境では、ユーザーへエラー詳細を表示せずログへ記録します。

error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

環境ごとに設定を分けることで、開発のしやすさと本番環境の安全性を両立できます。

PHPのエラーログを扱うときの注意点

PHPのエラーログには、アプリケーションの内部情報が含まれる場合があります。

そのため、ログへ出力する内容やログファイルの管理にも注意が必要です。

パスワードなどをログへ出力しない

次のようにパスワードをそのまま記録するのは避けます。

error_log('password=' . $password);

パスワードだけでなく、APIキー、アクセストークン、秘密鍵、クレジットカード情報などもログへ出力しないようにします。

ログファイルを公開ディレクトリへ置かない

ログファイルをDocumentRootなどWebから直接アクセスできる場所へ保存すると、設定次第では第三者から取得される可能性があります。

できるだけWeb公開ディレクトリの外側へ保存するのが安全です。

ログを無制限に保存しない

エラーログを長期間蓄積すると、ディスク容量を圧迫することがあります。

本番環境では、ログローテーションなどを利用して一定期間ごとにログを整理することも重要です。

PHPのエラーログを確認・出力する方法のまとめ

PHPのエラーを確認する場合は、error_reportingdisplay_errorslog_errorserror_logの役割を理解することが重要です。

開発環境では、次のようにすべてのエラーを表示するとデバッグしやすくなります。

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

本番環境では、エラーを画面へ表示せずログへ記録する設定が基本です。

error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

任意の情報をログへ出力したい場合は、error_log()を利用できます。

error_log('確認したいメッセージ');

また、PHPのエラーログに情報が見つからない場合は、Apache、Nginx、PHP-FPMなど周辺サービスのログも確認することが重要です。

PHP 8系ではThrowableを利用した例外処理も重要になるため、error_log()set_error_handler()trycatchset_exception_handler()などを適切に使い分けることで、より効率的に問題を調査できます。

以上、PHPのエラーログを確認・出力する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次