以中斷點方式替 Laravel 除錯

傳統 PHP 大都使用 echo()var_dump()dd() 除錯,此種方式必須破壞原本程式碼,而且所能觀察的變數有限,也無法明確得知程式執行的流程。PhpStorm 支援 Xdebug,允許我們設定中斷點,程式將停在中斷點設定之處,讓我們透過 Step Into、Step Over、Step Out 的方式除錯,非常方便。

Version


PHP 7.0.0
Laravel 5.2.37
MAMP PRO 3.5
PhpStorm 2016.1.2

設定 Xdebug


MAMP PRO 預設已經有安裝 Xdebug,只是在 php.ini 並沒有啟動,必須手動啟動後,再加上一些設定。

/Applications/MAMP/bin/php/php7.0.0/conf/php.ini
1
2
3
4
5
6
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.0.0/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/Applications/MAMP/tmp"

MAMP PRO 預設將 PHP 安裝在/Applications/MAMP/bin/php/phpX.X.XX/conf/php.ini,選擇版本加以修改php.ini1 1若不知道該改哪一個php.ini,可下php --ini指令,看看目前系統正在使用哪一個php.ini

其中 [xdebug] 位於 php.ini 的最後一行,預設使用 ; 註解,將 ; 拿掉,並加上以上的 Xdebug 設定。

存檔後須重新啟動MAMP。

設定 Hosts


在 MAMP PRO 設定新 host。

  • PHP version : 7.0.0。
  • Document root : /Users/oomusou/Code/Demo/Laravel52Xdebug_demo/public

存檔後須重新啟動MAMP。

啟動 PHP 外掛


PhpStorm -> Preferences -> Plugins

  • PhpStorm 預設已經安裝並啟動 PHP 外掛,確認此外掛已經啟動。

設定 Interpreter


PhpStorm -> Preferences -> Language & Frameworks -> PHP

  • PHP language level : 7
  • Interpreter : 按 ... 設定PHP interpreter。2 2PHP Interpreter 每個專案都要重新設定一遍。

選擇 PHP 7.0.0 的路徑 : /Applications/MAMP/bin/php/php7.0.0/bin/php

若路徑正確,PhpStorm 會抓到 PHP 與 Xdebug 的版本。

從原本的 <no interpreter> 變成明確的 PHP7 (7.0.0)

產生 Bookmarklets


PhpStorm -> Preferences -> Language & Frameworks -> PHP -> Debug

  • 按下 Use debugger bookmarklets to initiate debugging form your favorite browser,將會使用你預設的瀏覽器開啟 https://www.jetbrains.com/phpstorm/marklets/

在左側的 Xdebug 部分,按下 Generate

將產生 Start debuggerStop DebuggerDebug this page

將這 3 個連結拖拉到上方的 Bookmarks Bar。

  • Start debugger : 啟動 Xdebug 除錯。
  • Stop debugger : 停止 Xdebug 除錯。
  • Debug this page : 啟動 Xdebug,並重新載入目前網頁。

設定中斷點


app/Http/routes.php 的 14 行的最左側點一下,設定中斷點。3 3實務上你可以在任何你想要除錯的 PHP 程式碼中設定中斷點,本範例是以 Laravel 預設專案的 routes.php 為例。

傾聽 Xdebug


按下上方的 電話筒 圖示,綠色表示開始傾聽 Xdebug,可在所設定的中斷點停止。

啟動 Xdebug


開啟瀏覽器,按下 Start debugger,在網址列輸入 http://laravel52xdebug:8888

PhpStorm 會跳出 Incoming Connection From Xdebug 視窗,按 Accept 繼續。

程式執行將停在剛剛設定的中斷點。

下方會出現 Debugger 視窗,提供除錯的詳細資訊。

  • 左側綠色三角形為 Resume Program,表示將繼續執行,直到下一個中斷點停止。
  • 左側紅色方形為 Stop,表示停止目前程式執行。
  • 上方第一個圖示為 Step Over,表示將跳過目前函式。
  • 上方第二個圖示為 Step Into,表示將執行目前函式內部的程式碼。
  • 上方第三個圖示為 Force Step Into,表示將強制執行目前函式內部的程式碼。
  • 上方第四個圖示為 Step Out,表示將跳出目前函式內部的程式碼。
  • 上方第五個圖示為 Run to Cursor,表示將快速執行到目前游標處停止。
  • Variables 為目前 scope 所有的變數值。
  • Watches 可自行新增想觀察的變數。

Conclusion


  • 使用這種方式之後,我再也沒用過 echo()var_dump()dd() 來除錯,只要在認為有問題的程式碼之處,設定中斷點,就可以觀察當時所有變數的值,並且觀察程式實際執行的流程。