Docker でサーバー側のエラーログ(PHP Warning)を出力
  1. 銀ねこアトリエ
  2. 海外ノマドブログ
  3. ウェブ制作
  4. Docker
  5. Docker でサーバー側のエラーログ(…

Docker でサーバー側のエラーログ(PHP Warning)を出力

この記事は、Docker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB)の続きです。運用しているWebサイトの本番環境で PHP Warning が発生してしまいました。そのエラーを修正したいのにエラーを見ることができず、修正できたかわからない状況に陥りました。

PHP Warning(警告) は、スクリプトの実行中に 致命的 なエラーが発生したときに表示されるメッセージ

次はよく起こる PHP Warning(警告) です。

  • 未定義変数の使用: 作っていない変数を使おうとする場合
  • 配列でないものへのアクセス: 配列ではないにも関わらず、配列のようにアクセスした場合
  • 配列のインデックスが存在しない: 配列のインデックスが存在しない場合

この記事を試すためには Docker 環境が必要です。先に「 Docker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB) 」を参考にしてください。

Docker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB)

サーバー・インフラの知識がなくても、Dockerを使用して本番環境に忠実に作成する手順を解説。docker-compos...

この記事を書いた人

神守 由理子/フロントエンドエンジニア

資金ゼロからフィリピンで起業したアラフィフ海外ノマドエンジニア。最近は「フィリピンお役立ち情報」「ナチュラルアンチエイジング」「人生から得た哲学」など実体験を発信。最近AIの発達でテックブログはお休みしているけど、IT業界10年以上でテクニカルディレクター(技術責任者)・エンジニア講師・ブリッジSEを経てLenzTechnologies Inc.を設立し、代表を務める。

この記事の対象者

  • サーバー・インフラのことはあんまりわからない
  • 自分のコードのエラーが確認できる環境を構築したい
  • Dockerをイチから作ってみたい
  • 本番環境と開発環境で使うサーバー、PHP、データベースの種類やバージョンを厳格に揃えたい

PHPエラーログが出力できるか確認してみる

前回は、PHPエラーをログに残せる設定をコンテナ内に追加したところまでやりました。

エラーログを確認してみましょう。わざとエラーを発生させる、error_test.php 作成します。

myproject/
   ├-- public/
   │   ├-- index.html
   │   ├-- index.php
   │   └-- error_test.php ← 追加
   ├-- docker/
   │   ├-- nginx/
   │   │   └-- nginx.conf
   │   ├-- errors/
   │   ├--php/
   │   │    ├-- Dockerfile
   │   │    └-- php.ini
   │   └-- db/
   │        └-- init.sql
   └-- docker-compose.yml

よくあるPHPの警告を意図的に発生させてみましょう!

未定義変数の使用し、配列でないものへのアクセスの確認した場合。

public/error_test.php
<?php
$variable = false;
echo $variable['key'];
echo $undefined_variable;

PHP Warning: Trying to access array offset on value of type bool PHP Warning: Undefined variable $undefined_variable

他にもPHP Worning はあります。一般的なものを紹介しておきます。

PHP Warning説明
Division by zero0で割ろうとした場合。
Invalid argument supplied for foreach()foreach ループに対して無効な引数が渡された場合。
array_merge(): Argument #x is not an arrayarray_merge 関数に配列でない引数が渡された場合。
Cannot modify header information - headers already sentheader 関数が呼び出される前に出力が行われた場合。

リアルタイムでモニタリングしながらエラーを監視する

リアルタイムでモニターしながらも開発できます。

コンテナに入り、logファイルの変更を監視します。tailコマンドはファイルの末尾の変更を監視するコマンドです。

コマンド
docker exec -it myproject_php /bin/bash
tail -f /var/log/php_errors.log
全部文字が白くてわかりづらいですね。 コンテナに入り、logファイルの変更を監視します。

特定のエラー文字を検索して色を付けることもできます。

コマンド
tail -f /var/log/php_errors.log | grep --color=auto -E 'PHP Fatal error|PHP Warning'
特定のエラー文字を検索して色を付けることもできます

モジュールの追加などコンテナーの設定をし直したい場合

PHP モジュールの追加などコンテナーの設定をし直した場合は、コンテナを再構築する必要があります。

一度構築したコンテナを再構築するにはdocker-compose up --build -dを使います。

コマンド
docker-compose down
docker-compose up --build -d

まとめ・PHPでも エラーを追いながら開発する

本番環境に忠実な開発環境を準備のは基本です。

私もインフラやサーバーは苦手だから徹底的に調べつくしたり勉強するのは今まで避けてきました。

今回この記事を書くことで Docker への理解がより深まりました。副作用として、サーバーやPHP、MariaDBのこともかなり理解できました。

かみーゆ
かみーゆ

今回勉強になりとても良い経験になりました

この記事がみなさんのコーディングライフの一助と慣れば幸いです。

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

FAQ

PHP Warning が画面には表示されず、ログファイルにだけ記録されるのはなぜですか?

php.ini の設定で display_errors = Off かつ log_errors = On になっているためです。開発環境では php.ini の設定 を一時的に display_errors = On にすると画面上でも即座に確認できますが、本番環境ではセキュリティ上、Offのままログで監視するのが鉄則です。

tail -f コマンドでログを監視しているのに、エラーを発生させても何も表示されません。

ログファイルの書き込み権限(パーミッション)が不足しているか、PHP-FPMが参照しているログパスが間違っている可能性があります。コンテナ内で ls -l /var/log/php_errors.log を実行し、実行ユーザー(www-dataなど)に書き込み権限があるか確認してください。詳細は リアルタイムでモニタリングする をご覧ください。

Dockerコンテナ全体のログをまとめて確認する方法はありますか?

特定のファイルだけでなく、コンテナの標準出力を確認したい場合は docker logs -f [コンテナ名] コマンドが便利です。PHP-FPMの設定によっては、エラーログを標準出力にリダイレクトさせることで、ファイルを開かずにターミナル上で一括管理することも可能です。

Cannot modify header information... という Warning の解決策は?

これは header() 関数の前に、意図しない空白や HTML 出力、あるいは echo が行われている場合に発生します。ログを監視しながら、エラーが発生した行の直前に余計な出力がないかチェックしましょう。代表的な Warning への対処は 一般的なPHP Warning表 にまとめています。

  1. Previous
  2. Next