この記事は、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 Fatal Error の違いが知りたい
- PHP Warning(警告)はスクリプトの実行を継続しますが、PHP Fatal Error(致命的エラー)はスクリプトの実行を即座に停止します。
- docker コマンドと docker-compose コマンドの違いが知りたい
- docker コマンドは単一のコンテナを操作するためのコマンドで、docker-compose コマンドは複数のコンテナを定義し、管理するためのコマンドです。
- 非エンジニアだけどDockerの開発環境を作ってみたい
- Docker公式のドキュメントや簡単なチュートリアルを参考に、ステップバイステップで始めるのがおすすめです。