XAMPPのPHPをXDebugでデバッグできるようにする

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の孫記事です。環境などの条件は、親記事をご覧ください。
この記事は、「[XAMPPでPHP＋MariaDB(MySQL互換)環境を構築する 2018年12月版](https://qiita.com/hitotch/items/0e1751ef38f83a9f3bf4)」の子記事です。

---
　[前回](https://qiita.com/hitotch/items/ab791fbc11a4e2a6cefd)はVisual Studio CodeでXAMPPのPHPコーディングが気持ちよく行えるようになる状態まで環境を構築しましたので、今回はデバッガが動作して、ブレイクポイントやステップ実行が利用できる状態まで構築していきます。

# XDebugを入手する
　XDebugとは、実行されているPHPアプリとソースコードエディタをつないでくれる、Apache WebサーバーのExtension（拡張機能）です。XDebugを入手して、Apacheに組み込むと、Visual Studio Codeでブレイクポイントやステップ実行が利用できるようになるわけです。

　早速XDebugをダウンロードしたいところですが、XDebugはApacheやPHPのバージョンに強く依存するので、「これをダウンロードしたらOK」とはいきません。このため、XDebugの入手は以下のように少し特殊な手順で進めます。

　まず、https://xdebug.org を開けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/6d00df65-94c0-89a9-e068-6fcb59da7738.png)

　Downloadのリンクを開けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/573ba25b-c337-387f-b01d-8b8ece803a88.png)

　画面下にたくさんのバージョンが表示されますが、この中から選ぶのは大変なので、XDebugが準備してくれているツールを使います。**custom installation instructions** (カスタムインストール説明)をクリックして、ツール画面を開けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/4237dda8-db39-37ff-6775-dcf2ec2ae541.png)
　この画面の説明を簡単に訳すと、「phpinfo()で表示される内容をここに貼り付けてね」と書いてあります。
　なので、前回表示したphpinfo()の出力結果画面を全選択して、コピーします。（Hello worldごとコピーしてかまいません）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/cc11bddb-5e30-44e8-5c94-2a6e4fa849cb.png)

　さっきのXDebugのツール画面に戻って、貼り付けします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/a0000064-77df-32c0-61c6-2ca7554009b7.png)
　最後に、「Analyse my phpinfo() output」（phpinfo()の出力を解析）ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/1d3d4d1a-ea09-bd3f-14a4-f979f82da0b1.png)

　解析が終わると以下のような解析結果が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f4957e49-8059-0bf3-729a-24de432f63f9.png)

　解析結果には、**Xdebug installed:** no　と表示されていて、まだXdebugがインストールされていない状況であることが確認できます。インストール後にここをもう一度確認することにします。
　結果の下に**Instructions**（インストール方法説明）があるので、ここにあるファイルをダウンロードします。これがXDebug本体です。

　ダウンロードしたファイルを、**C:\xampp\php\ext** フォルダに置きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/3fc847a7-1025-0d45-6c5f-018b896a75d6.png)

# PHPにXDebugを組み込む
　XDebug本体をPHPのextフォルダ内に置きましたが、これだけではまだXDebugがPHPに組み込まれていません。
　XDebugをPHPに組み込むには、**php.ini**ファイルを編集して、XDebugを使うように指示します。

　XAMPP Control Panelを開き、ApacheのConfigの「PHP (php.ini)」をクリックして、php.iniを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f265e084-2afc-9e31-8fcd-c8c1ea8e1afd.png)

　php.iniの最終行まで移動して、以下のコードを追加します。

```php.ini
(上部省略)

zend_extension = C:\xampp\php\ext\php_xdebug-2.6.1-7.2-vc15.dll

[xdebug]
xdebug.default_enable = 1
xdebug.idekey = "vscode"
xdebug.remote_enable = 1
xdebug.remote_port=9000
xdebug.remote_autostart=1
```

　ここで、dllファイルの記述部分は、ダウンロードしたファイル名にすることに注意してください。

```
zend_extension = C:\xampp\php\ext\php_xdebug-2.6.1-7.2-vc15.dll
```

この記述によって、PHPはextフォルダに置いたXDebug本体を読み込みます。
その下の**[xdebug]**からの数行は、XDebugを「有効にする」ための設定です。この記述を追加しないと、Apache+PHPで動作させたときにXDebugを使ってくれません。
　記述後は以下のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/c5bd4e33-ba7b-836b-716f-19659203e00f.png)

　この状態までできたら、このファイルを保存し、メモ帳を閉じます。

　**ここで必ずApacheを再起動してください。**（[Stop]して[Start]する。）
　再起動しないと、php.iniの変更が反映されません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/7f3c485a-752b-e91b-0b80-660895c4ed32.png)

　これで設定は完了なので、動作していることを確認しましょう。先ほどと同じようにphpinfo()の出力結果画面を表示し、**表示内容を再読み込みして**、全選択してコピーし、XDebugツール画面に貼り付けて「Analyse my phpinfo() output」ボタンを押します。
　以下のように、**Xdebug installed:** 2.6.1 などとバージョン情報が表示されていたら成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/6b782b19-66e2-ebf3-88e8-e3195df27d66.png)

# Visual Studio CodeにXDebugを設定(PHP Debugをインストール)
　Apache+PHP側にはXDebugが入ったので、次はVisual Studio Code側でデバッグ情報を受信できるようにします。デバッグ情報受信には、PHP DebugというExtensionを使います。

　Visual Studio Codeを開いて、Extensionsボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/abb67f10-5590-9db9-a1b8-5f1a6e2bbf60.png)

　検索条件に**xdebug**と打ち込んで、PHP Debugをインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/7adce5cc-6796-c4c9-8b0a-9463d1cf315b.png)

　**ここで一度Visual Studio Codeを再起動してください。**

　次にデバッグボタンを押してデバッグ画面を開きますが、以下のように「No Configurations」と出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/ffca1372-3971-6d14-fc4d-692916a09196.png)

　ここにデバッグConfiguration（デバッグ設定）を作ることで、Apache+PHPからの受信ができるようになります。「No Configurations」のすぐ右の歯車ボタンを押します。
　どの環境のConfigurationを作りたいか選択肢で聞かれるので、PHPを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/0e23336e-bacb-6ad0-19cc-43275627c1f0.png)

　**ここでPHPが出ない場合は、Visual Studio Codeを再起動してください。**

　すると自動的に**launch.json**というファイルが生成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/69ff8ac3-4684-6722-8aa1-0d52bd494037.png)

　このファイルの場所は、プロジェクトの.vscodeフォルダの下です。
　このファイルではXDebugからの情報を受信するための設定が書かれますが、特に変更しなくて大丈夫です。8行目に「Listen for XDebug」とありますが、この部分がXDebug用のデバッグConfiguration部分になります。

　デバッグ画面に戻ると、今作ったConfigurationがちゃんと出てくるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/9ff576bd-03b9-7099-5845-605739e99d8c.png)

　デバッグ実行ボタン（緑の右三角ボタン）を押すと、デバッグモードが開始されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/08ac116c-3b82-d7e9-02b8-6854d72c1869.png)

　初回はファイアウォールの警告が出るので、「アクセスを許可する」してください。

　これでデバッグの準備は完了です。

# デバッグしてみよう
　早速デバッグしてみます。ここでは、デバッグの機能でよく使うブレークポイントとウォッチを使ってみます。
## ブレークポイント
　前回までに作成した**info.php**の２行目に、以下のように行の左をクリックしてブレークポイントを設置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/e8106195-4b67-38ee-4eac-6170ca3e6a4f.png)

　動作をわかりやすくするため、まずはブラウザーで http://localhost/ を開きます。特にこの時点では何も起こらないはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/a4e9c071-b319-6393-b788-25ce00ca3316.png)

　次に、http://localhost/info.php を開きます。すると、ブラウザの表示は変わらずに、Visual Studio Codeがアクティブになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/90839512-c7ea-61e9-26cd-680b23427994.png)

　Visual Studio Codeを見ると、先ほどのブレークポイントで処理が停止しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/64d154ff-d011-7be6-8458-ea254015a403.png)

　ここでステップボタンを押すと、次の行に処理が進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/5be40feb-b3fb-4e73-f172-a5a36da667f2.png)

　あとはContinueボタンを押して残りの処理を進めましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/6fde919b-3ecf-1c95-c102-9d0d03e0be5f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/c3ccff89-6e7c-a630-09c1-35f19369e503.png)

## ウォッチ
　ウォッチでは、ブレークポイントで止めた時に、変数の中身などを観察することができます。
　**info.php**のコードを以下のように書き換えてください。

```info.php
<?php 
echo "Hello world";
$test = 123;
echo "$test points get!";
phpinfo();
```

 **書き換えたら保存を忘れないでください。**　私はよく忘れてパニックになります。

　ブラウザーに戻って、再読み込みします。そうするとまたブレークポイントで止まります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/5fa4c9ea-bf00-9f0b-a0d0-a026b90c7fde.png)

　今回は\$testという変数の中身を確認したいので、WATCHの「＋」をクリックし、\$testを登録します。入力したらエンターキーで確定です。
　中身はもちろんまだ入ってないので、nullになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/fe272506-06e2-c92f-baa7-6ecf304c93ae.png)

　ステップ実行して２行進めると、\$testに*123*が入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/33517c34-9a31-4d25-cad6-2e25b7d0b052.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/0891d32f-bfdb-3fd8-b201-3eee134dd3d8.png)

　また、WATCHに登録していなくても、マウスカーソルをソースコードの変数の上に持っていくと、内容がポップアップします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/bab67144-021c-13dc-f82c-fef5ba0e2689.png)

　便利ですね！