この記事は、Docker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB)の続きです。運用しているWebサイトの本番環境で PHP Warning が発生してしまいました。そのエラーを修正したいのにエラーを見ることができず、修正できたかわからない状況に陥りました。
PHP Warning(警告) は、スクリプトの実行中に 非致命的 なエラーが発生したときに表示されるメッセージ
次はよく起こる PHP Warning(警告) です。
- 未定義変数の使用: 作っていない変数を使おうとする場合
- 配列でないものへのアクセス: 配列ではないにも関わらず、配列のようにアクセスした場合
- 配列のインデックスが存在しない: 配列のインデックスが存在しない場合
この記事を試すためには Docker 環境が必要です。先に「 Docker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB) 」を参考にしてください。

神守 由理子/フロントエンドエンジニア
この記事の対象者
- サーバー・インフラのことはあんまりわからない
- 自分のコードのエラーが確認できる環境を構築したい
- 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の警告を意図的に発生させてみましょう!
未定義変数の使用し、配列でないものへのアクセスの確認した場合。
<?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 zero | 0で割ろうとした場合。 |
| Invalid argument supplied for foreach() | foreach ループに対して無効な引数が渡された場合。 |
| array_merge(): Argument #x is not an array | array_merge 関数に配列でない引数が渡された場合。 |
| Cannot modify header information - headers already sent | header 関数が呼び出される前に出力が行われた場合。 |
リアルタイムでモニタリングしながらエラーを監視する
リアルタイムでモニターしながらも開発できます。
コンテナに入り、logファイルの変更を監視します。tailコマンドはファイルの末尾の変更を監視するコマンドです。
docker exec -it myproject_php /bin/bash
tail -f /var/log/php_errors.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表 にまとめています。

