はじめに
PHPのデバッグ方法をググるとvar_dump
かdd
、Log
をコード内に仕込むという記事が見つかります。
しかし、Rubyのbinding.pry
を経験してからだとこれは効率悪いと感じるのではないでしょうか。
変数1つずつ確認するために追記して実行してログを見てまた修正して実行して..という苦行はしたくないです。
PHPだとPsySHを使えばpryのようなデバッグができるということで、この記事ではPsySHをDokerの開発で使うために試したことを記載します。
Rubyのbinding.pryとは
binding.pryは、アプリケーションサーバの実行を中断してデバッグできる便利機能です。
ブレークポイントをしかけた場所で動作が止まり、そこのスコープでRubyのコードが対話的に書けます。
処理を止めたところで有効な変数やその中身の確認、関数なども実行できて結果もすぐわかります。
しかもこれがview、controller、modelのほぼどこでも記載すれば処理を一時的に止めることができるのでかなりデバッグしやすいです!
PHPでデバッグ
やり方は、下の3つだけです。
- docker-compose.ymlにportsを追記する
-
$ docker-compose exec app php -S 0.0.0.0:8000 -t public
でサーバー起動 - デバッグしたいところに
eval(\Psy\sh());
を入れる
順番に設定からデバッグするところまでを記載します。
docker-composeを使用した例で、laradockなども同様に行えると思います。
まず、php用のコンテナにportsを追加します。
version: '3.7'
services:
app:
build: ./api-server
container_name: php
volumes:
- ./api-server:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
working_dir: /var/www/html
# 追加
ports:
- "8001:8000"
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- 8000:80
volumes:
...(省略)
mysql:
image: mysql:8.0
...(省略)
docker-compose up -d
などした後にプロジェクトのルートディレクトリでサーバーを起動します。
$ docker-compose exec app php -S 0.0.0.0:8000 -t public
localhost:8001 に向けてリクエストを実行してサーバーにログが出ればOKだと思います。
例)curl http://localhost:8001/health-check
あとはお好きなところにeval(\Psy\sh());
を記載してプログラムを動かすと処理が止まって対話的にデバッグができると思います!
終わる時はexit
とすれば続きの処理が再開されます。
今回の例ですと、$user
や$params
の値が確認できています。変数以外の関数も実行できたりするので良いと思っています。
少し設定を加えるだけで導入できるので、Rubyの開発からPHPに移行してきて間もない方、Docker+PHPでデバッグ方法に困っている方の参考になれば幸いです。