😀

PHPでVim使って開発していてvar_dump()を唱えているならVim Plugin のvdebugを使ってみろって

2022/11/28に公開

ずっと自分はPHPでvar_dumpを唱えていました。
でも、もうvar_dump()って唱えたくないんですよ。
間違えて

/path/to/hoge
// var_dump($hgoe);

とかコミットしてしまうじゃあないですか・・・・
だしタイプするのが、億劫なんですよ。

vdebugがあるじゃないか!!!

元々はVim + Vdebug + Xdebug でPHPのリモートデバッグ を読んで
「vimでもbreakpoint貼れるのかー。じゃあやってみよう」
ということでやってみた時のメモになります。

環境

  • Scientific Linux 6.4
  • CentOS 6.4

参考にしたサイト

事前準備に必要なもの

  • vim 7.2 以降(で自分は試した)
  • PHP 5.4.32 (5.6.0)でもやった
  • 自分はphpenvで実行しています
  • PHP extension Xdebug
  • phpenvで入れた場合はデフォルトではいっています
  • chrome (chromeからvdebugを起動します)
  • python 2.6 以上

vim にvdebugをインストールする

NeoBundleでインストールしています

# ~/.vimrc

" PHP debugger
NeoBundle 'joonty/vdebug'

補足: OSの環境がutf-8じゃない方への設定

utf-8なサーバーで実行する場合vdebugがエラーになる可能性があります。
理由はvdebugの各種breakのマーカーなどの設定がutf-8じゃないと認識できない文字列をデフォルトで設定しているからです。

その場合は下記をvimrcに追加してください

# ~/.vimrc
let g:vdebug_force_ascii = 1

教えてくれたH.Nさんサンクス!!!

Xdebugの設定の確認

まずはXdebugの設定を確認しましょう

# $PHPENV_HOME/phpenv/versions/{PHPバージョン}/lib64/php/modules/xdebug.so
Enable xdebug extension module
zend_extension=/usr/lib/phpenv/versions/5.4.32/lib64/php/modules/xdebug.so

# 最低限これだけ入れておいてください
; see http://xdebug.org/docs/all_settings
html_errors=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

コンソール上でVdebugを実行する方法

UnitTestやPHPバッチの動作確認等については下記の記事を参照してください

ブラウザと連動したVDebugを実行したい場合

ブラウザと連動した場合のVdebugを実行する場合はXDebug-helperを使用したVDebugの使用方法です。

chrome-extensionのXdebug-helperを入手

ブラウザでリロードしてXDebug用のcookie発行しての実行になります
joonty/vdebug 自体はこれがなくても動作すると思いますが、自分はよくわかりませんので、そこらへんはすごい人にお任せします

Xdebug-helperのオプション設定をする

一人でローカル環境を構築する場合はこの設定は必要ありません。
複数人でデバックする場合は個々にIDE_KEYを設定しないと上手くdebugできません。

chromeから

chrome://extensions/

でxdebug-helperのオプションをクリックしてください

chrome-extension設定

IDE_KEYを設定する

デフォルトはXDEBUG_ECLIPSEです。

IDE_KEY項目のオプションを

  • other
  • 任意のIDE_KEY

を設定してください

xdebug-helper オプション

これで前準備は完了です。

VDebugを起動してみる

vimでファイルを開いてbreakpointを貼りたいところで fn + F10 をおしてください

vdebugでbrealpointを貼った状態

その後 fn + F5 を押すとdebugの待ち状態になります。
デフォルトだと20秒間何もアクションが起こらないとErrorになります。
(きっとどこかで設定できるはず)

vdebugのdebug待ち状態になったところ

chrome側のxdebug-helperを Debug に変更する

xdebug-helperのモードを「Debug」にします

xdebug-helperをONにする

これでchromeのブラウザをリロードしてください
下記のような感じになります。

vdeub 起動した状態

vdebugの使い方

基本は Vim + Vdebug + Xdebug でPHPのリモートデバッグ に記載されていますのでこちらを見てください。

コマンド 説明
fn + F10 breakpointを貼る
fn + F5 デバッガの起動
fn + F3 ステップイン
fn + F2 ステップアウト
fn + F9 fn + F10 で設定した場所までの実行
fn + F7 デバックの終了 (debug画面を :q とかで終了すると次回起動時にエラーになるので注意)

StackTraceからのファイルジャンプ

StackTraceに出ている対象のファイル一覧でエンターを押すとそのファイルにジャンプできます。

変数のWatch画面について

対象の変数の中身がArrayやObjectで構造体が深い場合はエンターを押すと展開できます

これでPHPで var_dump() の魔法を唱えなくてもいい第一歩が踏み出せそうです。

Discussion