IntelliJ + php + fuel + xdebug + vagrant でリモートデバッグする

PHP(Fuelフレームワーク)を触ることがたまにあるのでリモートデバッグの方法をメモする。書いてみたけどPHP自体よくわかってない

vagrant のIP 192.168.33.10
ローカルのIP 192.168.33.1

root@vagrant-ubuntu-trusty-64:~# php -v
PHP 5.5.9-1ubuntu4.20 (cli) (built: Oct  3 2016 13:00:37)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

ディレクトリ構成

blogの下にfuelのコード一式が入っている f:id:hs_hachi:20161116015908p:plain vagrantconfig.vm.synced_folder "./html/blog", "/data", owner: "www-data", group: "www-data"をしてるところ以外は特記するところはない。

ゲスト側の設定

php周りのインストール

add-apt-repository ppa:ondrej/php5-5.6
apt-get update
apt-get install -y php5 php5-fpm nginx php5-cli php5-xdebug

/etc/nginx/conf.d/php.conf の設定

server {
    # バーチャルサーバが使用するアドレス、ポートを指定
    listen 80 ;

    # サーバの公開ディレクトリを指定
    # /data をローカルと同期してる
    root /data/public;
    # インデックスページを指定
    index index.php index.html index.htm;

    # URIごとにどのファイルを配信するか設定
    location / {
        # 指定したパスにファイルが存在するかどうか
        if (-f $request_filename) {
            # キャッシュの有効期限を設定
            expires 30d;
            break;
        }
        if (!-e $request_filename) {
     rewrite ^(.*)$ /index.php?q=$1 last;
        }
    }

    location ~ [^/]\.php(/|$) {
        # PATH_INFO 部の分割に使用する正規表現を指定
        # 一つ目 ( .+\.php ) は $fastcgi_script_name の値になり、二つ目 ( /.+ ) は $fastcgi_path_info の値になる
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        # FastCGI サーバへリクエストをプロキシする
        #fastcgi_pass 127.0.0.1:9000;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        # スラッシュで終わる URI の後に追加されるファイル名を設定
        # $fastcgi_script_name の値になる
        fastcgi_index index.php;
        # 設定ファイルを読み込む
        include fastcgi_params;
        # 環境設定を与える
        fastcgi_param PHP_IDE_CONFIG serverName=192.168.33.10;
        # FastCGI サーバに渡されるべきパラメータを設定
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    }
}

/etc/php5/fpm/php.ini に追加

[xdebug]
zend_extension="/usr/lib/php5/20121212/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host="192.168.33.1"
xdebug.remote_handler=dbgp
xdebug.remote_port=9001
xdebug.remote_autostart=1
xdebug.idekey="phpdebug"
; annot accept external Xdebug connection: Cannot evaluate expression 'isset($_SERVER['PHP_IDE_CONFIG'])' 対策
xdebug.extended_info=1

Intellijの設定

ディレクトリ構成のところで設定しているIP, /dataの設定以外に、Language & Framework > PHP > Debugのportを9001にする メニューの Run > Break at first line in PHP scriptにチェックを入れる(デバッグをOFFにしたいときはこれを外す) メニューの Run > Start Listening For PHP debug Connection を選択する ブラウザなどで http://192.168.33.10/hello/a にアクセスするとブレークポイントに止まる。 f:id:hs_hachi:20161116020529p:plain

ちなみに

  • php.iniに書いたxdebug.idekeyはなくても動いた
  • controllerにブレークポイントに置くと止まるが、自分で作ったクラスだと止まらないことがある。その時は呼び出し前にブレークポイントを漬けてF7でStepInする(多分フレームワークの規則に従ってないだけ?)
  • Rubyを書くこともたまにあるがIntelliJで書いてる。Javaで書いてたときも使ってたから体がこれに慣れてるし、1つのIDEで複数言語を書けるのは非常にコスパがいい