Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

laravel_peng發表於2022-06-10

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

文章目錄

前言

曾經我的除錯方式:

也許很多小夥伴都和我有相同的經歷,假如程式需要排查問題時,預設方式是 echoprint_r()var_dump() 或 Laravel 框架內建的 dd() 函式。這種方式非常的簡單便捷,很容易上手。但是它也有一些不足之處,比如說:

  • 需要在程式中植入列印的程式碼,操作簡單但容易忘記撤回。
  • 列印的資訊有限,如想列印其他資訊,還需新增程式碼。
  • 只能區域性的輸出,不能展示全域性以及全流程的資訊輸出。

現在我的除錯方式:

現在使用上了 PHP 的 xdebug 擴充套件進行除錯,雖然麻煩些但是它值得你為他付出時間與精力。它的優勢有:

  • 無需在程式中植入程式碼,您只需在編輯器中選擇斷點位置即可。
  • 列印資訊很全面,包括程式執行流程(說到這裡,使用它你可以真正瞭解框架整個執行流程),以及斷點位置的各種變數資訊。

所以你還在 猶豫什麼

  • 也許它如何配置?以及如何使用? 這應該是你最應該關心的。
  • 但你所關心的也正是我接下來要講述的。跟著文章一點一點繼續下去,我想你應該會有所獲。也會增加你使用 xdebug 的信心。

環境 & 版本號:

  • 主機:MacProBook
  • 作業系統:MacOS Monterey
  • 虛擬機器工具:vagrant
  • 開發環境:Homestead v13.2.1
  • PhpStorm 版本:2021.3.3
  • PHP 版本:8.0.13
  • Xdebug 版本:3.1.1
  • Laravel 版本:Laravel 8.83.5

以上是我本機所使用的 PHP 整體的開發環境。可能很多人都和我的不一樣,要麼是作業系統、要麼是開發環境等,不過影響不大。這一篇先保證開發環境是 Homestead就行,如果你們按照我的方式不能使用,後續我再出新的文章討論相關細節問題。

進入 Homestead 開發環境

啟動 & 進入環境

  • 啟動環境
cd ~/Homestead && vagrant up
  • 進入環境
vagrant ssh
  • 進入後,像這一樣:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

看一下 Homestead.yaml 檔案下,我的專案使用的那個 PHP 版本:

  • 開啟 Homestead.yaml 檔案, code 是我配置 vscode 編輯器的快捷命令:
cd ~/Homestead && code .
  • 檢視對應專案使用的 PHP 版本為:8.0,其實我這個專案是指定了 PHP 版本,不指定的話使用預設的 PHP 版本。

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

獲取 php.ini 檔案

我們知道,要想使用 PHP 的擴充套件,必須先下載並安裝它,最終生成 xxxxx.so 擴充套件檔案,然後在 php.ini 檔案中引用這個擴充套件。這樣輸出的 phpinfo() 內容會並顯示對應的擴充套件資訊。但是 homestead 環境已實現幫我們下載好對應的擴充套件了,我們只需找到 php.ini 配置檔案並正確引用它就可以了。

  • 檢視命令列的 PHP 的版本:
php -v
  • 版本號如下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 如果版本號不是你專案對應專案的版本號,您可以透過以下命令切換:
# 切換到 8.0
php80
# 切換到 7.4
php74
...
  • 您可以透過在虛擬機器命令列中輸入 php 在加上 tab 鍵,可以看到支援的所有 php 命令:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 正常情況下我們透過這種方式檢視 php 的配置檔案地址:
php --ini
  • 但是我發現,命令列輸出好多配置檔案資訊,而且這些配置檔案路徑都有一個很明顯的特徵,這些檔案都在 /etc/php/8.0/cli 資料夾下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是這個路徑是不行的,因為 /etc/php/8.0/cli 下的配置檔案是作用於 cli 模式(命令列模式)下執行檔案的配置。而不是透過瀏覽器訪問域名,經過 nginx 伺服器轉發到 php 執行檔案的配置。然後我就想看一下是否有其他模式,我羅列 cli 目錄的上一級目錄 /etc/php/8.0
ll /etc/php/8.0

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是要說具體用的是那種模式,我想還得看一下 nginx 才行,為什麼呢?因為 nignx 作為伺服器它不會解析 .php 檔案,它需要解析器才可以,而我們要看 nginx 交給了誰來解析。檢視 homestead 裡面 nginx 的配置命令:

透過 nginx 配置檔案,查詢對應的 PHP 模式

  • 獲取 nginx 的配置檔案:
# 必須使用 sudo ,不然會報錯 
sudo nginx -t
  • 執行結果如下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 開啟 /etc/nginx/nginx.conf 檔案:
vim /etc/nginx/nginx.conf
  • 擷取部分內容如下:
...
http {
    ...
    # 其他檔案的引入
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
  • 我們發現 nignx.conf 檔案本身還引用了其他的配置檔案,尤其看這個 include /etc/nginx/sites-enabled/* 目錄,執行命令:
ll /etc/nginx/sites-enabled
  • 我們看到是一些 link 軟連線檔案:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 真正的專案 nginx 配置檔案是這個:/etc/nginx/sites-available/dcat-config.test,檢視它:
vim /etc/nginx/sites-available/dcat-config.test
  • 我們找到有關 .php 檔案是如何處理的:
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
}
  • nginx 執行到有 .php 檔案時,它會透過 fastcgi 協議將內容傳遞給 fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; ,也就說 php8.0-fpm.sock socket 套接字檔案接收了 nignx 傳遞過來的資訊。具體什麼是 php8.0-fpm.sock,詳情可參考

  • 同樣也可以說明,從瀏覽器傳送過來的請求是透過 php-fpm 模式下接收了資訊並執行的。所以此時 PHP 使用的模式是 fpm 模式,那麼它的 php.ini 檔案也要在這個模式下獲取。

獲取 fpm 資料夾下的配置檔案

  • 列出 fpm 資料夾,我們終於找到了它 php.ini 檔案:
ll /etc/php/8.0/fpm
  • 執行結果如下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是 xdebug 的相關配置檔案沒在 php.ini 檔案,它在 /etc/php/8.0/fpm/conf.d 資料夾下,執行命令:
ls /etc/php/8.0/fpm/conf.d
  • 至此,我們終於找到了它 20-xdebug.ini 檔案,接下來我們配置它。

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

配置 Xdebug 擴充套件

修改配置檔案內容如下:

zend_extension=xdebug.so
xdebug.mode = debug
xdebug.discover_client_host = true
xdebug.client_port = 9005
xdebug.max_nesting_level = 512
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.idekey = PHPSTORM
xdebug.remote_autostart=1
xdebug.client_host=192.168.56.1
xdebug.remote_handler=dbgp
xdebug.start_with_request=yes
xdebug.remote_autostart=1

儲存修改,並重啟 php-fpm

  • 執行命令(根據自己的 php-fpm 版本號,自行重啟):
sudo service php8.0-fpm restart
  • 輸出 phpinfo() 檢視 php 的配置資訊,確定已經載入成功了:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

配置 PhpStorm 編輯器

點選配置 PhpStorm 的 Debug 編輯配置選項

  • 如圖所示:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 點選進入頁面,內容如下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 點選左邊加號,新增一個PHP Remote Debug專案,然後填寫好下面的幾個選項。

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步驟說明:

  • 第 3 步:Name 名字隨便取就行。
  • 第 4 步:勾選上。
  • 第 5 步:最重要的是 IDE key 要填寫 PHPSTORM,這個和剛才 xdebug.ini 裡設定的xdebug.idekey = PHPSTORM 是對應的。
  • 第 6 步:點選 ... 三個點按鈕,新增服務。

新增 Servers 專案:

  • 點選 ... 三個點按鈕進入頁面如下:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步驟說明:

  • 第 2 步:Name 名字取為 homestead 是因為服務用的就是這個開發環境。
  • 第 3 步:使用專案對應的本地 host 配置的域名。
  • 第 4 步:預設 80 埠。
  • 第 5 步:使用 Xdebug 除錯擴充套件。
  • 第 6 步:使用路徑對映,這裡指的是主機專案檔案和虛擬機器專案檔案的對映。
  • 第 7 步:dcat-config 專案的虛擬機器絕對路徑是 /home/vagrant/Code/learn-github/dcat-config

新增完 Service 並儲存配置:

  • 儲存方式如下:
    Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

開啟 PhpStorm 的偏好設定 Command + , 並對 PHP CLI 進行設定

  • 開啟 PHP 的配置:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 點選新增 CLI Interpreters,並選擇 From Docker,Vagrant,VM,WSL,Reote 這個選項:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 選擇 Vagrant 例項 Homestead 所在的目錄:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 然後點選確定:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 然後點選 PHP 偏好設定選項,找到 Debug 這個配置項,配置 Debug Port 為:9005。注意劃重點了:這個埠之所以用 9005,而不是其他如(9000,9003)是因為我試過它不行(也許是埠占用了),改為 9005 是可以的!!!
  • 配置完然後驗證 validate 第五步全是對號 ✅ 就沒問題了。
  • 注意:其中 Path to create validation script 的路徑一定要到 public

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 到此為止,PhpStorm 就和 homestead 虛擬機器連結上了。

配置瀏覽器

安裝 Xdebug helper 外掛:

  • 外掛下載連線(需要梯子):

    https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
  • 下載完後,谷歌瀏覽器擴充套件列表會有一個小蟲子的圖示如下所示:

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 不過我發現,在我 PhpStorm2021.3.3 版本,好像不需要這個外掛也能打斷點的。

開啟除錯

Xdebug3 斷點除錯環境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步驟如下:

  • 第 1 步:在程式碼中打斷點。
  • 第 2 步:在瀏覽器訪問 dcat-config.test host 域名。
  • 第 3 步:PhpStorm 自動彈出,斷點的列印資訊,在這裡可以看到任何你想看變數的值。

結語

  • 到此 xdebug 的配置和除錯的方法已經講完了,內容看起來很多,原因是圖片很多,主要是為了講清楚。但是總體上就四大步。
    • 配置 xdebug.ini 資訊。
    • 配置 PhpStorm 編輯器。
    • 配置 Goggle Chrome 瀏覽器。
    • 打斷點,並重新整理頁面觸發斷點。
  • 很麻煩,但是很值得。你終於不再懼怕太多未知的問題了,因為 xdebug 除錯工具可以幫你完成。
  • 有了這個除錯工具,那些擴充套件包程式碼以及框架底層的程式碼的執行流程將一覽無餘,你在框架的理解上也會比別人快很多,這也是你進步的階梯,所以,何樂而不為呢?

參考連線:

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Xiao Peng

相關文章