LoginSignup
0

posted at

updated at

Docker+PHPの開発でrailsのpryみたいにデバッグする

はじめに

PHPのデバッグ方法をググるとvar_dumpddLogをコード内に仕込むという記事が見つかります。
しかし、Rubyのbinding.pryを経験してからだとこれは効率悪いと感じるのではないでしょうか。
変数1つずつ確認するために追記して実行してログを見てまた修正して実行して..という苦行はしたくないです。

PHPだとPsySHを使えばpryのようなデバッグができるということで、この記事ではPsySHをDokerの開発で使うために試したことを記載します。

Rubyのbinding.pryとは

binding.pryは、アプリケーションサーバの実行を中断してデバッグできる便利機能です。
ブレークポイントをしかけた場所で動作が止まり、そこのスコープでRubyのコードが対話的に書けます。

処理を止めたところで有効な変数やその中身の確認、関数なども実行できて結果もすぐわかります。
しかもこれがview、controller、modelのほぼどこでも記載すれば処理を一時的に止めることができるのでかなりデバッグしやすいです!

PHPでデバッグ

やり方は、下の3つだけです。

  1. docker-compose.ymlにportsを追記する
  2. $ docker-compose exec app php -S 0.0.0.0:8000 -t publicでサーバー起動
  3. デバッグしたいところにeval(\Psy\sh());を入れる

順番に設定からデバッグするところまでを記載します。
docker-composeを使用した例で、laradockなども同様に行えると思います。

まず、php用のコンテナにportsを追加します。

docker-compose.yml
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
スクリーンショット_2023-05-17_11_11_15.png

あとはお好きなところにeval(\Psy\sh());を記載してプログラムを動かすと処理が止まって対話的にデバッグができると思います!
終わる時はexitとすれば続きの処理が再開されます。

今回の例ですと、$user$paramsの値が確認できています。変数以外の関数も実行できたりするので良いと思っています。
少し設定を加えるだけで導入できるので、Rubyの開発からPHPに移行してきて間もない方、Docker+PHPでデバッグ方法に困っている方の参考になれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0