文章目錄
前言
曾經我的除錯方式:
也許很多小夥伴都和我有相同的經歷,假如程式需要排查問題時,預設方式是
echo
、print_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
- 進入後,像這一樣:
看一下 Homestead.yaml 檔案下,我的專案使用的那個 PHP 版本:
- 開啟
Homestead.yaml
檔案, code 是我配置vscode
編輯器的快捷命令:
cd ~/Homestead && code .
- 檢視對應專案使用的 PHP 版本為:
8.0
,其實我這個專案是指定了 PHP 版本,不指定的話使用預設的 PHP 版本。
獲取 php.ini 檔案
我們知道,要想使用 PHP 的擴充套件,必須先下載並安裝它,最終生成
xxxxx.so
擴充套件檔案,然後在php.ini
檔案中引用這個擴充套件。這樣輸出的phpinfo()
內容會並顯示對應的擴充套件資訊。但是homestead
環境已實現幫我們下載好對應的擴充套件了,我們只需找到php.ini
配置檔案並正確引用它就可以了。
- 檢視命令列的 PHP 的版本:
php -v
- 版本號如下:
- 如果版本號不是你專案對應專案的版本號,您可以透過以下命令切換:
# 切換到 8.0
php80
# 切換到 7.4
php74
...
- 您可以透過在虛擬機器命令列中輸入 php 在加上
tab
鍵,可以看到支援的所有 php 命令:
- 正常情況下我們透過這種方式檢視
php
的配置檔案地址:
php --ini
- 但是我發現,命令列輸出好多配置檔案資訊,而且這些配置檔案路徑都有一個很明顯的特徵,這些檔案都在
/etc/php/8.0/cli
資料夾下:
- 但是這個路徑是不行的,因為
/etc/php/8.0/cli
下的配置檔案是作用於cli
模式(命令列模式)下執行檔案的配置。而不是透過瀏覽器訪問域名,經過nginx
伺服器轉發到 php 執行檔案的配置。然後我就想看一下是否有其他模式,我羅列cli
目錄的上一級目錄/etc/php/8.0
:
ll /etc/php/8.0
- 發現它有
cgi
、cli
、fpm
和phpdbg
這幾種模式: 更多模式詳解請參考
- 但是要說具體用的是那種模式,我想還得看一下
nginx
才行,為什麼呢?因為 nignx 作為伺服器它不會解析.php
檔案,它需要解析器才可以,而我們要看nginx
交給了誰來解析。檢視homestead
裡面 nginx 的配置命令:
透過 nginx 配置檔案,查詢對應的 PHP 模式
- 獲取
nginx
的配置檔案:
# 必須使用 sudo ,不然會報錯
sudo nginx -t
- 執行結果如下:
- 開啟
/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
軟連線檔案:
- 真正的專案
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
- 執行結果如下:
- 但是
xdebug
的相關配置檔案沒在php.ini
檔案,它在/etc/php/8.0/fpm/conf.d
資料夾下,執行命令:
ls /etc/php/8.0/fpm/conf.d
- 至此,我們終於找到了它
20-xdebug.ini
檔案,接下來我們配置它。
配置 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 的配置資訊,確定已經載入成功了:
配置 PhpStorm 編輯器
點選配置 PhpStorm 的 Debug 編輯配置選項
- 如圖所示:
- 點選進入頁面,內容如下:
- 點選左邊加號,新增一個PHP Remote Debug專案,然後填寫好下面的幾個選項。
步驟說明:
- 第 3 步:Name 名字隨便取就行。
- 第 4 步:勾選上。
- 第 5 步:最重要的是 IDE key 要填寫
PHPSTORM
,這個和剛才xdebug.ini
裡設定的xdebug.idekey = PHPSTORM
是對應的。 - 第 6 步:點選
...
三個點按鈕,新增服務。
新增 Servers 專案:
- 點選
...
三個點按鈕進入頁面如下:
步驟說明:
- 第 2 步:Name 名字取為 homestead 是因為服務用的就是這個開發環境。
- 第 3 步:使用專案對應的本地 host 配置的域名。
- 第 4 步:預設 80 埠。
- 第 5 步:使用
Xdebug
除錯擴充套件。 - 第 6 步:使用路徑對映,這裡指的是主機專案檔案和虛擬機器專案檔案的對映。
- 第 7 步:
dcat-config
專案的虛擬機器絕對路徑是/home/vagrant/Code/learn-github/dcat-config
。
新增完 Service 並儲存配置:
- 儲存方式如下:
開啟 PhpStorm 的偏好設定 Command + ,
並對 PHP CLI 進行設定
- 開啟 PHP 的配置:
- 點選新增 CLI Interpreters,並選擇
From Docker,Vagrant,VM,WSL,Reote
這個選項:
- 選擇
Vagrant
例項Homestead
所在的目錄:
- 然後點選確定:
- 然後點選 PHP 偏好設定選項,找到 Debug 這個配置項,配置 Debug Port 為:9005。
注意劃重點了:這個埠之所以用 9005,而不是其他如(9000,9003)是因為我試過它不行(也許是埠占用了),改為 9005 是可以的!!! - 配置完然後驗證
validate
第五步全是對號 ✅ 就沒問題了。 - 注意:其中
Path to create validation script
的路徑一定要到public
下
- 到此為止,PhpStorm 就和 homestead 虛擬機器連結上了。
配置瀏覽器
安裝 Xdebug helper 外掛:
外掛下載連線(需要梯子):
https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
下載完後,谷歌瀏覽器擴充套件列表會有一個小蟲子的圖示如下所示:
- 不過我發現,在我 PhpStorm2021.3.3 版本,好像不需要這個外掛也能打斷點的。
開啟除錯
步驟如下:
- 第 1 步:在程式碼中打斷點。
- 第 2 步:在瀏覽器訪問
dcat-config.test
host 域名。 - 第 3 步:PhpStorm 自動彈出,斷點的列印資訊,在這裡可以看到任何你想看變數的值。
結語
- 到此
xdebug
的配置和除錯的方法已經講完了,內容看起來很多,原因是圖片很多,主要是為了講清楚。但是總體上就四大步。- 配置
xdebug.ini
資訊。 - 配置
PhpStorm
編輯器。 - 配置
Goggle Chrome
瀏覽器。 - 打斷點,並重新整理頁面觸發斷點。
- 配置
- 很麻煩,但是很值得。你終於不再懼怕太多未知的問題了,因為
xdebug
除錯工具可以幫你完成。 - 有了這個除錯工具,那些擴充套件包程式碼以及框架底層的程式碼的執行流程將一覽無餘,你在框架的理解上也會比別人快很多,這也是你進步的階梯,所以,何樂而不為呢?
參考連線:
- Laravel開發系列三:PHPStorm+Homestead+XDebug3除錯
- xdebug-phpstrom Waiting for incoming connection with ide key xxxx問題說明
- Homestead 下關於 PhpStorm Xdebug 斷點除錯工具的安裝
- 折騰 HomeStead 配置xdebug
本作品採用《CC 協議》,轉載必須註明作者和本文連結