PHP

PHPエラーログ設定完全ガイド:php.ini・権限・Docker対応

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

1️⃣ PHP 本体の設定 ― php.ini の主要ディレクティブ

ディレクティブ 目的 推奨値 (例)
log_errors エラーログ出力を有効化 On
error_log ログファイルの保存先 (絶対パス) /var/log/php/error.log (Linux)
C:\\php\\logs\\error.log(Windows)
display_errors エラーを画面に表示するか 本番: Off、開発: On
error_reporting どのエラーレベルを対象にするか E_ALL(開発)
E_ALL & ~E_DEPRECATED & ~E_STRICT(本番)

設定例(Linux 用)

公式マニュアル
- log_errorserror_log: https://www.php.net/manual/en/errorfunc.configuration.php#ini.log-errors
- display_errors: https://www.php.net/manual/ja/errorfunc.configuration.php#ini.display-errors
- error_reporting: https://www.php.net/manual/ja/errorfunc.configuration.php#ini.error-reporting


2️⃣ ログファイルの配置と OS 権限

2‑1. Linux(Ubuntu/Debian 系)

  • ポイント
  • chmod 0755 は「所有者が書き込み可、他は読み取り・実行可」なのでディレクトリ探索に必要です。
  • ファイル単位で 0644 にすれば、Web サーバー以外のユーザーからの書き込みを防げます。

2‑2. Windows(IIS)

  1. エクスプローラーで C:\php\logs を作成。
  2. フォルダーの [プロパティ] → [セキュリティ] にて、使用するアプリケーションプール ID(例:IIS AppPool\MyAppPool)または IUSR に「書き込み」権限を付与。
  3. php.ini ではバックスラッシュを 二重にエスケープ することを忘れずに。

2‑3. SELinux / AppArmor の考慮

  • SELinux: setsebool -P httpd_unified 1 または対象ディレクトリにポリシー例外を追加。
  • AppArmor: /etc/apparmor.d/usr.sbin.php-fpm"/var/log/php/** rw," を追記し、systemctl reload apparmor

3️⃣ コードからログ出力を制御するテクニック

3‑1. ランタイムで設定を書き換える (ini_set)

3‑2. error_log() の活用例

  • 第2引数 3 は「ファイルへ直接書き込む」モード。
  • 複数行の構造化ログが必要なら JSON にシリアライズして出力すると、後続の Logstash/Fluentd との相性が良くなります。

3‑3. Monolog で高度なロギング

メリット
- ログレベル(debug、info、warning、error…)の細分化
- 複数ハンドラ(ファイル・syslog・Slack 等)への同時出力が可能


4️⃣ 環境別ベストプラクティス ― 開発 / 本番 / Docker

環境 php.ini の要点 補足
開発(ローカル) display_errors = On
log_errors = On
error_reporting = E_ALL
error_log = /path/to/dev/error.log
IDE と同時にファイルを tail すれば即座に原因把握が可能
本番(物理/仮想サーバ) display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_log = /var/log/php/error.log
ログは外部 SIEM へ転送(例: Filebeat → Elasticsearch)
Docker コンテナ error_log = /proc/self/fd/2(stderr) Docker の標準ロギングドライバが自動収集。環境変数で上書き可能にすると柔軟性が向上

4‑1. Dockerfile とエントリポイント例

  • PHP_INI_SCAN_DIR を利用すれば、conf.d/ 配下に複数の設定ファイルを分割管理でき、コンテナ起動時に自動でマージされます。

5️⃣ トラブルシューティングフロー

  1. ログファイルが生成されているか
  2. ls -l /var/log/php/error.log(Linux)やエクスプローラーで確認。

  3. 書き込み権限は正しいか

  4. Linux: stat -c "%U %A" /var/log/php/error.log → 所有者が Web サーバーユーザーか、パーミッションが rw- か。
  5. Windows: 「プロパティ → セキュリティ」で対象ユーザーに「書き込み」権限があるか。

  6. SELinux / AppArmor の制約
    bash
    # SELinux が拒否している場合は audit.log に記録される
    ausearch -m avc -ts recent | audit2allow -w -a

  7. 必要に応じて setsebool かカスタムポリシーで例外を付与。

  8. パスのエスケープミス(Windows)

  9. error_log = "C:\php\logs\error.log" → バックスラッシュが1つだけだと文字列が途中で切れる。必ず "C:\\php\\logs\\error.log" と記述。

  10. リアルタイム確認コマンド

OS コマンド
Linux tail -F /var/log/php/error.log (ログローテーション対応)
macOS 同上(BSD版 tail -f でも可)
Windows PowerShell Get-Content -Path C:\php\logs\error.log -Wait
  1. PHP‑FPM のエラーログ
    conf
    ; php-fpm.conf (global)
    error_log = /var/log/php/fpm_error.log
    log_level = notice
  2. systemd 管理下なら journalctl -u php-fpm -f で一元閲覧できる。

📌 まとめ(ポイントだけ)

  • php.ini の主要ディレクティブは必ず明示的に設定し、公式マニュアルのリンクを添えておく。
  • ログ保存先は 絶対パス とし、OS の所有者・権限を正しく付与する(Linux は www-data、Windows はアプリプール ID)。
  • ランタイムで ini_set()error_log() を使い、モジュール単位の細かい制御や JSON/Monolog で構造化ログを実現。
  • 環境別(開発/本番/Docker)に設定を分け、Docker では stderr 出力+環境変数で切り替えると運用が楽になる。
  • トラブル時は「ファイル・権限」「SELinux/AppArmor」「パスエスケープ」の順にチェックし、tail -FGet-Content -Wait でリアルタイム監視する。

これらのベストプラクティスを導入すれば、PHP 8.3 のエラーログは確実に取得でき、障害対応やパフォーマンスチューニングが格段にスムーズになります。

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-PHP