[PHP]Vagrantの環境をNetBeansからリモートデバッグする

#はじめに
+ [いまさらvagrant入れました](http://qiita.com/tosite0345/items/6ca6c1441d96eb74528b)
+ [NetBeans初期設定について](http://qiita.com/tosite0345/items/8ed6c0d8103f16f30228)

この辺の準備が整ってきたので、いよいよリモートから開発できる環境を整えていきます。

#環境
ローカル側
>Windows10 Pro x64
Core i5-6300U 2.40GHz
メモリ16.0GB

--------
>Vagrant 1.9.3
VirtualBox 5.1.18 r114002


VM側
>CentOS Linux release 7.3.1611 64bit

--------
>httpd(Apache)
PHP 5.6.30
Xdebug 2.5.3


#設定手順
##Virtual Machineを立ち上げる
###起動する
設定手順・起動方法などについては[こちら](http://qiita.com/tosite0345/items/6ca6c1441d96eb74528b)を参照のこと。

##CentOS側の設定
以下の手順に沿って設定を行っていく。

+ httpdサービスの起動とfirewalldサービスの停止を行う
+ シンボリックリンクの設定を行う
+ サービスのインストールをする
+ 設定ファイルの書き換えを行う

なお、ID/PASS：vagrant - vagrantでログイン時に以下のコマンドを投入しておくとラク。

```bash:bash
$ sudo su - # ルートユーザーに切り替える
```

###httpdサービスの起動とfirewalldサービスの停止を行う
コマンドライン上から下記コマンドを投入する。

```bash:bash
$ systemctl stop firewalld   # ファイアーウォールを止める
$ systemctl start httpd      # Apacheを起動する

# 念のため現在の状態を確認する
$ systemctl status firewalld
$ systemctl status httpd

# 次回以降、起動時に自動で設定するためのコマンド
$ systemctl enable httpd.service
$ systemctl disable firewalld.sercive

# そんなサービスねーよって言われたときの対応
$ yum -y install httpd
```
![ICOPY011.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/787d25ba-a5de-9160-d591-bb1d9b1d5ba4.jpeg)

念のため、ローカル環境から**Vagrantfile**に設定したIPを叩いて、サービスが起動していることを確認する。
![ICOPY012.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/f5444c09-4bf3-56be-d71b-9c01b2c35fc2.jpeg)

###シンボリックリンクの設定を行う
*シンボリックリンクとは？*
>シンボリックリンクとは、OSのファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。リンクは本体と同じディレクトリに置いても良いが、通常は別の場所から参照できるようにするために作成される。UNIX系OSでよく用いられるもので、Windowsでも利用することができる。

ということで、本来はショートカット的な意味合いを持つものらしい。
やりたいことは**ローカルのディレクトリをVM側のドキュメントルートに設定する**と言うものだが、シンボリックリンクを利用することで一発らしい。ステキ。
なお、**ドキュメントルートはVagrantfileがあるディレクトリ直下**(以下、便宜上*ローカルドキュメントルート*と呼称)となる。

```bash:bash
$ rm -rf /var/www/html          # 現在のドキュメントルートを削除
$ ln -fs /vagrant /var/www/html # ローカルディレクトリをドキュメントルートとしてリンク
```

こちらもテスト的なことを行う。
ローカルディレクトリにinfo.htmlを作成し、表示されることを確認する。
![ICOPY014.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/e1b50f84-6dbc-dd22-feb8-a06e5b9890ce.jpeg)
![ICOPY013.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/5203a735-818c-1712-43cf-e3f5ae33333e.jpeg)

###サービスのインストールをする
必要なサービスをインストールしていく。
今回新たにインストールするサービスは、**PHP**と**Xdebug**。
PHPには[Zend Engine](http://qiita.com/7968/items/2aa487e2e515dba2fd03)なるものが利用されているようです。時間があるときに調べようと思います。

```bash:bash
#リポジトリのインストール
$ yum install -y epel-release
$ yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# php-mycryptインストール
$ yum --enablerepo=epel install -y libmcrypt

# PHP+Xdebugインストール
$ yum --enablerepo=remi,remi-php56 install -y php php-mysqlnd php-opcache php-mbstring php-gd php-mcrypt php-xml php-pear php-devel php-xmlrpc php-pecl-apcu php-pecl-xdebug
# remi-php56の部分を書き換えれば別バージョンのPHPも入れられると思う。

# 例によってインストール確認
$ php -v
```
![ICOPY016.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/35c89bab-0948-9e15-f6cb-44882f7ff609.jpeg)
うまくいっていれば**with Xdebug v2.5.3**の文字が目に入ることと思う。

###設定ファイルの書き換えを行う
インストール直後は設定ファイルがアレなので、修正していきます。
主に修正するのは次の２つ。

+ php.ini
+ 15-xdebug.ini

他の文献ではxdebug.iniとしか記述されていませんでしたが、こちらの環境では**15-xdebug.ini**として作成されていました。これを書き換えたところ、正常に動作。
####*/etc/php.ini*
```ini:php.ini
zend_extension="/lib64/php/modules/xdebug.so"
;xdebug.soファイルのフルパス

xdebug.remote_enable=On
xdebug.remote_connect_back=On
xdebug.remote_autostart=On

xdebug.remote_host=192.168.33.10
;Vagrantfilesに記述したIPアドレス

xdebug.remote_port=9000
xdebug.max_nesting_level=1000
xdebug.idekey="SAMPLE"
```

**xdebug.so**の場所が分からずに詰みかけました。微妙に文献と違うんだよなぁ...。

####*/etc/php.d/15-xdebug.ini*
```ini:15-xdebug.ini
;extension=xdebug.so
;これをコメントアウトして

zend_extension=/usr/lib64/php/modules/xdebug.so
;xdebug.soファイルへのフルパスに書き換える

xdebug.default_enable = 1
xdebug.remote_enable  = on
```

```bash:bash
$ systemctl restart httpd # 念のためApacheを再起動
```

またまた念のため*ローカルドキュメントルート*にphpファイルを追加し、phpinfoを出力させる。

```php:info.php
<?php
    phpinfo();
```
![ICOPY024.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/2fe99e6d-7660-e274-465a-710c412652a3.jpeg)

この辺からXdebugが有効化してることを確認する。

##NetBeans側の設定
いよいよNetBeansからリモートデバッグできるように設定をしていく。

###プロジェクトの初期設定を行う
![2a6776a7-a76c-ebbc-4be3-bfec77c5a7b2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165355/6722ac67-9444-f74f-13b8-9a0b172b2236.jpeg)
***ファイル → 新規プロジェクト***を選択し、プロジェクト作成ダイアログを開く。

![ICOPY017.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/d72e55ea-e54e-1ff3-9f61-f4048f929861.jpeg)
特に何も設定せず、***次へ***をクリックする。

![ICOPY018.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/5dc006cd-aa2a-30a2-9cef-a57779fb4886.jpeg)
***ソース・フォルダ***横の***参照***ボタンをクリックし、*ローカルドキュメントルート*の場所を指定する。

![ICOPY020.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/ff7b587e-71d9-7ca5-8511-3f8bd647b0fa.jpeg)
***実行方法***は変更せず、***プロジェクトURL***をVMのIPアドレスに設定する。
***終了***をクリックする。

![ICOPY023.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/1817604b-c350-2e81-598e-0e5e5d800c7a.jpeg)
プロジェクト名を右クリックし、***プロパティ***を選択する。

![ICOPY026.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/0bdc3a21-bea1-6689-cfef-f91f9f64a27a.jpeg)
左側の***実行構成***から進み、***詳細***ボタンをクリックする。

![ICOPY022.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/c18d5d49-89fe-341c-1270-2795261abc3c.jpeg)
***毎回聞く***にチェックを入れ、***OK***をクリック。

###実行してみる
![1f79de00-372e-58c3-b175-f55c4cdef7c0.jpeg](https://qiita-image-store.s3.amazonaws.com/0/165355/5d2836d6-708f-89b3-502f-147c6d7252d0.jpeg)
テキトーなところにブレークポイント打ってデバッグボタン横プルダウンから***プロジェクトをデバッグ***を選択。

![ICOPY030.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/5d2a537e-fa34-b8df-536b-0e837482718e.jpeg)
デバッグURLを聞かれるので、間違いなければ***OK***をクリック。

![ICOPY032.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/6e1a0bf9-51ee-3e9d-d4a2-311a8fa4a8cf.jpeg)
はい、リモートデバッグできるようになりました。

#所感
一度通ればなんてことはないのだけど...設定を通すまでがね...。
今後はmySQLやらphpMyAdminやらを整えた上でいよいよフレームワークやらユニットテストやらの設定に入ることになるのでしょうか。
Vagrantイイ。スゴクイイ。設定がうまくいってるところでboxファイル化しといて、しくじったらその時点にロールバックすればいいし。
あっ、NetBeansとGitとの連携とかも色々とあったなそういえば...。

#参考文献
+ [CakePHP2.xをNetBeansでデバッグする方法（CentOS7)](https://webtatan.com/blog/coding/cakephp/cakephp2-xdebug)
+ [Vagrant + PHP + Xdebug リモートデバッグする設定手順](http://tech.aainc.co.jp/archives/8470)
+ [Vagrant導入メモ](http://qiita.com/ANTON072/items/a0dabf0c2e4941803dce)
+ [NetBeans 8.2でのPHPのリモートデバッグ（ステップ実行）](http://blog.a-way-out.net/blog/2017/02/10/netbeans8-2-php-remote-debugging/)