如何使用 PhpStorm 對 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
並沒有啟動,必須手動啟動後,再加上一些設定。
1 | [xdebug] |
MAMP PRO 預設將 PHP 安裝在/Applications/MAMP/bin/php/phpX.X.XX/conf/php.ini
,選擇版本加以修改php.ini
。1 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 debugger
,Stop Debugger
與 Debug 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()
來除錯,只要在認為有問題的程式碼之處,設定中斷點,就可以觀察當時所有變數的值,並且觀察程式實際執行的流程。