Vagrant + Chef で開発環境を簡単に立ち上げることができるようになったので、Phpstorm6を使ってリモートデバッグできる環境を整えてみたいと思います。
Vagrant+ChefでApache、PHP、MySQLがインストールされていることが前提となりますが、何らかの仮想サーバやリモートサーバでもほぼ同じ作業でOKだと思います。
1.はじめに
まずはサーバにxDebugをインストールしますが、Chefでやっちゃいます。
chef-repoのcookbooksにあるレシピに、definitionsディレクトリがあるので、そこにpeclのDSLを定義します。
上記の例では/chef-repo/cookbooks/myrecipe/definitionsにpecl.rbというファイル名で、下記内容のファイルを作成します。
define :pecl do bash "install-#{params[:name]}" do code <<-EOC pecl install #{params[:name]} EOC not_if 'pecl list xdebug' end end
次に、レシピファイル(今回の例では/chef-repo/cookbooks/myrecipe/recipes/default.rb)に次の一文を追加します。
pecl 'xdebug'
これで vagrant up すると自動的にxdebugがインストールされます。
2.php.iniの編集
xdebugを有効化するため、php.iniを編集します。
ウチの環境では下記のような設定をphp.iniに追加しました。
[XDebug] zend_extension = "/usr/lib/php/modules/xdebug.so" xdebug.collect_params = 4 xdebug.default_enable = "On" xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_dir = "/tmp" xdebug.profiler_output_name = "xdebug_profile.%R::%u" xdebug.remote_autostart = 1 xdebug.remote_enable = 1 xdebug.remote_handler = "dbgp" xdebug.remote_host = 192.168.xxx.xxx xdebug.remote_log = "/val/log/xdebug.log" xdebug.remote_port = 9000
Chefを使っているなら、templateかcookbookfilesで処理するといいでしょう。
だがしかし!ここでいろいろハマりました。
「xdebugのマニュアル読みましょうw」というのはひとまず置いといて。
・xdebug.remote_autostart
これが0だと、スクリプトが走っても仮想サーバ側のデバッグ情報がホストOS側に投げられませんでした。
以前、xampp環境でxdebugを使った時はここが0でも上手く動いていたのですが...。
ちなみに、マニュアルにはここが0だと、GETかPOSTまたはCookieが投げられたらデバッグ情報投げるよ、1だと関係なく毎回デバッグ情報投げるよ、みたいに書かれているのですが、ウチの場合は期待通りに動作してくれませんでした。
・xdebug.remote_host
インターネット上の情報を拾ってきて設定を進めていて、最初は下記のような記述にしていたのですが...、
;xdebug.remote_host = "localhost" xdebug.remote_connect_back = 1
これだとホストOS側にデバッグ情報が送信されてきませんでした。
ここも、以前xamppで環境を作ったときはremote_connect_back = 1で上手く動作していたのですが...。
あと、ウチの環境だけかどうかわかりませんが、xdebugが動作したとき(PHPスクリプトが実行されたとき)にデバッグクライアント(今回の場合はPhpstorm)がデバッグポートを待ち受けていない場合、PHPの実行が非常に遅くなりました。
いろいろ試して気が付いたのですが、どうやらxdebugがデバッグクライアントのポートに接続しにいっても接続先がないため、timeoutするまで延々スクリプトの実行が遅延しているようです。
3.Phpstorm側の設定
Ctrl+Alt+SでPhpstormの設定画面を開きます。
Project SettingsのPHP->Debugを開きます。
中央付近のXdebugのDebug portに9000を設定します。
環境によってはこれだけでOKなのですが、ウチの場合はサーバーと作業フォルダのマッピングが必要でした。
4.ファイルマッピング
完全にローカルPCだけで完結している開発作業ならともかく、Vagrantで立てた仮想サーバとホストOSといった具合にサーバマシンと開発マシンが分かれている場合、サーバ側のファイルが、ローカルのどのファイルに相当するのかをマッピングしてやる必要があります。
まずはCtrl+Alt+Sで設定画面を開きます。
Project SettingsのPHP->Serversを選択。
サーバー情報がまだ追加されてない場合は「+」をクリック、既に仮想サーバが追加されている場合はそれを選択します。
Name: 適当にサーバ名を入力
Host:仮想サーバのIPかアドレス
Port:80(デフォルト)
Debugger:Xdebug
Use path mappings:チェックを入れて、ディレクトリツリーを表示します
File/Directoryに現在のローカル(ホストOS)側のプロジェクトで使用しているディレクトリやファイルが表示されるので、それらがサーバ側のどれに該当するかをAbsolute path on the serverに指定します。
ファイルを1個づつ指定しなくても、ディレクトリ構造が同じであればトップディレクトリをマッピングすればOKですが、もし仮想サーバと作業フォルダで構造が異なっている場合はサブディレクトリ単位またはファイル単位で指定する必要があります。
Absolute path on the serverは、そう書かれているように仮想サーバ(Vagrant)側の絶対パスで指定します。
例えばプロジェクトの作業フォルダが c:\project で、そこにindex.phpを作成したとします。
CentOSなどでyumからApacheをインストールした場合のデフォルトは/var/www/htmlがWebサーバのドキュメントルートになるはずなので
c:\project を /var/www/html にディレクトリ単位でマッピングするか、
c:\project\index.php を /var/www/html/index.php のようにファイル単位で個別にマッピングするかのどちらかになりますが、多くの場合はディレクトリ単位で指定する方がお手軽に済むでしょう。
以上で設定は完了になります。
あとは、Phpstorm側のリモートデバッグをOn(をクリック)にしてブラウザから仮想環境のPHPスクリプトを実行すればブレークポイントで停止するはず!