はじめに
こんにちは、普段は業務で求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回は laradock + atom + xdebug でPHPのステップ実行を行います。
これができればわざわざprint文を仕込んでデバッグしたりすることがなくなりますので、作業効率の向上につながります。同じように laradock + atom で開発を行っている方は是非参考にしていただければと思います。
やること
下の画像のように処理の途中で実行を一時停止しその時点での変数の中身を確認したり、コードを1行ずつ実行して次にどの条件分岐に入るのか確認したりできるようにしていきます。
開発環境
- OS:macOS Catalina 10.15.6
- PHP:7.4.11
- Laravel:6.18.26
- Docker:19.03.13
前提条件
Laravelプロジェクトを作成していること
laradockで必要なコンテナを立ち上げてブラウザからアクセスできること
実装
1. laradockの設定
まずlaradockの必要な設定を行います。
laradockのファイルが置いてあるディレクトリに遷移します。
$ cd xxxxxxx/laradock
envファイルを編集します。
$ vi .env
WORKSPACE_INSTALL_XDEBUG=false
PHP_FPM_INSTALL_XDEBUG=false
この2行を
WORKSPACE_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_XDEBUG=true
こう変えます。
次に設定ファイルも変更します。
$ vi workspace/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)
xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
内容に多少差異はあると思いますが、大体こんな感じになっていると思います。
ここを下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)
xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM
xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1
似たようなことをもう一回やります。
$ vi php-fpm/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)
xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
ここも大体こんな感じになっていると思いますので、下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)
xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM
xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1
ここまでできたら、コンテナを起動します。自分の環境にあわせて適宜変えてください。
$ docker-compose up -d nginx mysql redis
※私の環境ではxdebug.ini
の設定を変更する前にコンテナを起動していた場合、ステップ実行が正常に動作しませんでした。色々試しましたが最終的に一度イメージを削除して再度コンテナを起動すると正常に動作したので、もし正常に動作しなかった場合は一度イメージを削除して再度コンテナを起動してみてください。
ここまでいけば、laradock側の設定は終了です。
2. atom側の設定
laradock側の設定が終わったので、次にatom側の設定を行っていきます。
理由は後述しますがここからは使用するPHPのバージョンによってやることが変わるので、使用しているPHPのバージョンに合わせて変えてください。
使用しているPHPのバージョンが7.0以下の場合
パッケージの検索画面でphp-debug
と検索し、下記の画像と同じヒットしたパッケージをインストールしてください。
インストールすると、下記の画像のようにatom-debug-ui
というパッケージと、atom-ide-ui
というパッケージをインストールするように求められると思います。この2つのパッケージの役割は今回の記事の内容とは逸れるので割愛しますが、インストールしたphp-debug
を動作させるには必須のパッケージですのでYesを選択してインストールしてください。
php-debug
,atom-debug-ui
,atom-ide-ui
の3つのパッケージをインストールしたらphp-debug
の設定画面を開いてください。
まずはPortの設定を行います。
下記の画像を参考にServer Listen Port
を9002番(php-fpm/xdebug.ini xdebug.remote_port, workspace/xdebug.ini xdebug.remote_portと同じ値)
に設定してください。
次にPath Mappings
の下記の形式を参考にremoteとlocalのパスの設定を行います。
[{"remotePath":"","localPath":""}]
remotePathにはdockerコンテナ内のファイルパスを、localPathにはMacbook内のファイルパスを指定します。
私の場合だと下記のようになります。当然ですが、ご自身の環境に合わせて変えてください。
使用しているPHPのバージョンが7.1以上の場合
インストールするphp-debugのバージョンを変更します。理由はphp-debug 3.5
以上の場合に必須となるatom-ide-ui
にあります。このパッケージはatomにideのような様々な機能を持たせてくれる便利なパッケージなのですが、そのパッケージの機能の1つであるエラー解析がPHP7.0までしか対応していません。そのためPHP7.4から使える下記のような書き方をすると、エラーでないにもかかわらず警告が表示されてしまいます。
そのままでも動くといえば動くのですが、警告がうっとうしいのでatom-ide-ui
を必要としない古いバージョンのphp-debug
をインストールしていきます。
私の環境がMacなので、Macを例にしてやっていきます。
左上のメニューから Atom>シェルコマンドをインストール
を選択します。すでにインストールしていて、apmコマンドが使える方は飛ばしてください。
シェルコマンドのインストールが完了すると、apmコマンドが使えるようになるのでターミナルを開いて下記コマンドを入力します。
$ apm install php-debug@0.2.4
インストールが完了したら、下記の画像を参考に Path Maps と Server Address を設定してください。
インストールした php-debug のバージョンが古いため、remotePathとlocalPathの形式が異なっています。下記画像を参考に間違えないようにしてください。
結果
ステップ実行ができるようになったので、快適なPHPライフを送りましょう。