Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

homebrewでPHP+XDebug+VSCodeの開発環境構築をやり直す

More than 1 year has passed since last update.

Laravelのartisan serveで起動したビルトインサーバーでデバッグをします。以前、PHPとXDebugを入れていたのですが、うまく動かなかったので再挑戦。
結果、PHPを入れ直すことになったのでその手順を残しておきます。

  • macOS High Sierra
  • PHP 7.1.20
  • Visual Studio Code

使えるようになるまでの手順

homebrewでPHP

以前homebrewでPHPを入れていたはずだったのですが、whichしてみるとなぜかMacのデフォルトのphpを向いていることに気づきました。
調べてみると、Homebrew/phpがdeprecatedされた影響とのこと。

の記事を参考に、過去の設定を削除し、phpを入れ直します。

# 設定の削除
# 必要に応じてバックアップを取ってください
$ rm /usr/local/etc/php/7.1/conf.d/*

# brewからインストールしたPHP関連のモジュールをすべて削除
$ brew untap homebrew/php
$ brew list | grep php
php71
php71-xdebug
php@7.1
$ brew uninstall --force php71 php71-xdebug php@7.1

# 再インストール
$ brew install php@7.1
$ brew link --force php@7.1

以下のような表示が出た場合、

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile

言われたとおりにパスを通します。

# パスを通す
$ echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

# インストール確認
$ which php
/usr/local/opt/php@7.1/bin/php

まずはPHPが無事に入りました。

XDebugのインストール

以前はbrewからbrew install php71-xdebugとかで入ったんですが、これも使えなくなりました。
代わりに、peclを使ってインストールします。phpをインストールすると自動で入っているはず。

$ which pecl
/usr/local/opt/php@7.1/bin/pecl
$ pecl install xdebug

長いインストールログの後、

Build process completed successfully
Installing '/usr/local/Cellar/php@7.1/7.1.20/pecl/20160303/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.6.0
Extension xdebug enabled in php.ini

と吐き出してくれます。
が、私の環境ではまだ使えませんでした。全然enabledされてない。

XDebugを設定する

このインストーラーは、必要な設定をphp.ini先頭に追記するようなのですが、私の環境ではこの自動設定だと動きませんでした。例えばモジュール一覧を出そうとすると、以下のようなエラーが出てきます。

$ php -m
Failed loading /usr/local/Cellar/php@7.1/7.1.20/lib/php/20160303/xdebug.so:  dlopen(/usr/local/Cellar/php@7.1/7.1.20/lib/php/20160303/xdebug.so, 9): image not found

Macにもともと入ってるPHP7.1にxdebugを入れる方法(2018年7月版) を見ると、どうやら別の場所にxdebug.soが存在するようなので、そちらに設定を書き換えます。ついでに、php.iniの末尾に記述を移動し、必要な設定を付け加えます。

/usr/local/etc/php/7.1/php.ini
# 先頭に追加された以下の行を削除
zend_extension=xdebug.so

# 以下末尾に記載
[XDebug]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1

書き換えたら、phpを再起動します。

$ brew services restart php@7.1

これで無事に準備ができました。

$ php -v
PHP 7.1.20 (cli) (built: Jul 20 2018 10:27:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
    with Zend OPcache v7.1.20, Copyright (c) 1999-2018, by Zend Technologies

VSCodeでPHPデバッグ

初期設定

VSCodeでデバッグをする際は、PHP Debug という拡張機能をインストールします。
その後、デバッグ画面の設定でPHP用の設定を追加します。デバッグ画面のサイドバー上部、歯車のマークから、PHP用の構成を追加します。

自動で開いた設定ファイル/.vscode/launch.jsonを見ると、

  • Listen for XDebug
  • Launch currently open script

の2つが追加されていますが、前者がWebサーバー用の設定です(後者はPHPファイルを直接CLIから起動するときのデバッグ設定)。
portが9000になっていますが、これがxdebugのデバッグ用ポート指定です。もしphp.iniの中でxdebug.remote_portの値を変更している場合、ここもその指定に合わせます。

デバッグしてみる

設定ができたら、デバッグを試してみます。
適当なPHPを用意し、ブレークポイントを打ってみましょう(行番号の左側をクリックすると、赤丸でブレークポイントが表示されます。もう一度クリックで消えます)。

PHPの準備ができたら、サーバーを起動してみましょう。
Laravelを使っている場合はphp artisan serve、それ以外ならphp -S localhost:8000とかで起動します。9000番ポートを使わなければ大丈夫です。
ブラウザからアクセスし、正しく画面が表示されることを確認してください。

デバッグ画面サイドバーの緑色の三角ボタンを押すと、デバッグが開始されます。
その状態で再度ブラウザからアクセスすると、自動的にデバッグ画面が表示され、ブレークポイントで止まっているはずです。デバッグが非常に捗ります。

蛇足:Laravel 5系におけるXDebugでのデバッグ

Laravel 5系では、XDebugを使用したデバッグを行う際、プログラムと関係ない箇所で、必ず何回かブレークしてしまいます。

Illuminate\Contracts\Encryption\DecryptException: The payload is invalid.

例外処理によるブレークなので、ブレークしないように設定しても良いのですが、どうやらXdebugが発行するCookieが原因のようですので、php - Laravel 5 with Xdebug always throws "The payload is invalid." - Stack Overflowを参考に、以下のような記載をEncryptCookiesに追加すると防ぐことができます。

App\Http\Middleware\EncryptCookies.php
/**
 * The names of the cookies that should not be encrypted.
 *
 * @var array
 */
protected $except = [
    'XDEBUG_SESSION'
];

追加後は、以下のコマンドを実行します。

$ php artisan optimize
$ php artisan cache:clear
$ composer dump-autoload

これでもうまくいかない場合は、ブラウザのCookieを一度削除して、再度試してみてください。

それでは、よいデバッグライフをお過ごしください。

kiwi26
東京でスマートフォンアプリとか作ってます
nifty
インターネット接続やブログといったインターネット関連サービスを開発・提供している企業です。
http://www.nifty.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away