如何透過Xdebug和VSCode實施PHP除錯

如何透過Xdebug和VSCode實施PHP除錯

在開發網路應用程式時,您必須注意一些事項,以便順利交付最終產品。優秀的開發人員在建立強大的應用程式時會遵循最佳開發實踐,包括測試、除錯等。

本文將討論 PHP 除錯概念和編碼技術。請繼續閱讀,瞭解有關 PHP 除錯的更多資訊。

你可以在不進行任何配置的情況下開始除錯。但是,只有在需要連線到已配置 Xdebug 的現有 Web 伺服器或希望快速執行和除錯 PHP 指令碼時,才建議這樣做。

讓我們從最基本的除錯開始,在編寫 PHP 程式碼時,往往會使用 print_r()、var_dump() 命令來除錯已編寫程式碼的輸出。我們有許多 PHP 除錯工具,可以讓使用者在編碼過程中敦促修復錯誤,還有一些函式可以在程式碼失敗時顯示正確的輸出或錯誤/警告。雖然這種 PHP 除錯技術很基本,但仍在使用。

什麼是PHP錯誤日誌?

PHP 錯誤日誌是開發人員識別和解決應用程式問題的非常有用的工具。PHP 錯誤日誌會顯示指令碼執行時與錯誤、通知和警告有關的所有資訊,例如錯誤型別、錯誤出現在哪個檔案上以及發生錯誤的實際行號。透過這些日誌,開發人員可以即時識別故障,並透過研究它們來實施修復措施。

PHP錯誤日誌為何重要?

  • 除錯: 錯誤日誌有助於確定程式碼中的語法錯誤、執行時錯誤和邏輯錯誤。
  • 效能監控: 它們可以識別效能瓶頸或低效程式碼點。
  • 安全性: 日誌可以告訴你潛在的漏洞或試圖透過未經授權的方式進行訪問的情況。
  • 生產安全: 在生產過程中,錯誤日誌可幫助您跟蹤問題,而不會向使用者透露敏感資訊。

PHP錯誤日誌配置

要啟用和設定 PHP 錯誤日誌,必須更改 php.ini 檔案中的設定或使用執行時指令(如 ini_set())。

I. php.ini 主要指令:

這些是錯誤日誌的主要指令:

log_errors:開啟或關閉錯誤日誌記錄。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
log_errors = On
log_errors = On
log_errors = On

error_log:這是記錄錯誤的地方。請使用絕對路徑,以便一目瞭然。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
error_log = /var/log/php_errors.log
error_log = /var/log/php_errors.log
error_log = /var/log/php_errors.log

error_reporting:指定要記錄的錯誤型別。例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
error_reporting = E_ALL
error_reporting = E_ALL
error_reporting = E_ALL

E_ALL:記錄所有錯誤、警告和通知。

E_ERROR | E_WARNING:記錄致命錯誤和警告。

II. 透過.htaccess(按目錄)記錄日誌:

如果由於訪問受限而無法訪問或修改 php.ini,您可以透過.htaccess 按目錄記錄日誌。您可以在您關注的應用程式 .htaccess 檔案中新增以下程式碼塊:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php_flag log_errors On
php_value error_log /path/to/php_errors.log
php_flag log_errors On php_value error_log /path/to/php_errors.log
php_flag log_errors On
php_value error_log /path/to/php_errors.log

III. 使用 ini_set()進行執行時配置:

您還可以在 PHP 指令碼中新增以下程式碼塊,動態啟用日誌記錄功能:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ini_set('log_errors', 'On');
ini_set('error_log', '/path/to/php_errors.log');
ini_set('log_errors', 'On'); ini_set('error_log', '/path/to/php_errors.log');
ini_set('log_errors', 'On');
ini_set('error_log', '/path/to/php_errors.log');

檢視 PHP 錯誤日誌

PHP 錯誤日誌的儲存方式因主機配置而異:

1. 預設位置:

  • 對於 Linux 伺服器:/var/log/php_errors.log 或 /var/log/syslog
  • 對於 Windows 伺服器:事件檢視器(如果 error_log 配置為 syslog)

2. 寶塔面板位置:

對於使用寶塔面板管理的伺服器,您可以按照以下步驟輕鬆檢視日誌:

  • 登入寶塔面板。
  • 進入【軟體管理】或【執行狀態】頁面。
  • 找到【日誌管理】或【錯誤日誌】選項。
  • 在【PHP 錯誤日誌】部分檢視具體的錯誤資訊。

閱讀PHP錯誤日誌

PHP 錯誤日誌會提供一個資訊條目,描述發生了什麼。下面是一個日誌條目示例:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[13-Mar-2025 12:00:00 UTC] PHP Fatal error: Uncaught Exception: Database connection failed in /var/www/html/index.php on line 25
[13-Mar-2025 12:00:00 UTC] PHP Fatal error: Uncaught Exception: Database connection failed in /var/www/html/index.php on line 25
[13-Mar-2025 12:00:00 UTC] PHP Fatal error: Uncaught Exception: Database connection failed in /var/www/html/index.php on line 25

日誌資訊細分:

  • 時間戳:[13-Mar-2025 12:00:00 UTC] (世界協調時)
  • 錯誤型別:PHP 致命錯誤
  • Message:Uncaught Exception:資料庫連線失敗
  • 檔案和行號: /var/www/html/index.php,第 25 行

PHP錯誤日誌最佳實踐

您需要區分開發設定和生產設定,具體如下。

在開發環境設定中,可以包括以下內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
display_errors = On
log_errors = On
error_reporting = E_ALL
display_errors = On log_errors = On error_reporting = E_ALL
display_errors = On
log_errors = On
error_reporting = E_ALL

在生產環境設定中,可以包括以下內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = Off log_errors = On error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
  • 輪換日誌檔案:利用日誌輪換工具(如 logrotate)避免日誌檔案過大。
  • 保護日誌檔案:透過檔案許可權限制日誌檔案的訪問(例如,chmod 600 /path/to/php_errors.log),防止未經授權的訪問。
  • 定期監控日誌:利用 Rollbar 或 Loggly 等監控軟體進行即時日誌分析。
  • 特定框架日誌(如 Laravel):如果您使用的是 Laravel 或 Symfony 等框架,請使用其內建日誌,以實現更緊密的整合和更大的靈活性。

什麼是PHP除錯驅動開發?

早些時候,我並不清楚除錯驅動開發(DDD)這個術語,但我是從一個除錯員朋友那裡得到這個想法的。他的程式碼中包含多個斷點,他透過每一行的響應直到得到想要的輸出。DDD 的流程與 TDD 類似,首先定義所有 PHP 除錯技術的配置,然後編寫程式碼,以便在出現錯誤時進行除錯。一旦對 DDD 有了一定的瞭解,就應該學習Xdebug,它可以幫助你理解 PHP 除錯驅動開發的概念。使用 Xdebug 執行 PHP,可以全面瞭解錯誤、響應和程式碼覆蓋範圍。

什麼是Xdebug?

想象一下,你已經寫好了程式碼,但在編譯時卻出現了錯誤。最糟糕的是,你無法確定出錯的原因。Xdebug 就是你的救星。

Xdebug 是一個 PHP 擴充套件,它能幫助開發人員除錯並順利開發專案,從而發現錯誤並解決它們。它升級了 PHP 的 var_dump()函式,並新增了通知、警告、錯誤和異常的堆疊跟蹤。

Xdebug 使用 DBGp 除錯協議,提供除錯和剖析功能。它允許我們新增斷點,並在每個斷點停止程式碼執行,以檢視僅在一次程式碼迭代中輸出的變數。

因此,Xdebug 可以讓你節省時間,否則就會在程式碼除錯中浪費時間。如果沒有 Xdebug,你必須重新整理頁面才能再次看到輸出。您還可以設定獨立方法的斷點,以檢視是哪個方法導致了問題。

此外,你還可以在程式碼中新增任意數量的斷點,並使用 PHP 偵錯程式逐行檢查每行程式碼。

在PHP中安裝Xdebug

現在是在 PHP 中安裝 Xdebug 的時候了。有幾種安裝 Xdebug 的方法。

Windows:

對於 Windows 使用者,Xdebug 提供了一個嚮導工具,您可以透過它下載相關的 .dll 檔案。為此,首先在資料夾中建立一個 PHP 檔案,並新增以下程式碼行:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
phpinfo();
?>
<?php phpinfo(); ?>
<?php
phpinfo();
?>

在瀏覽器中執行該檔案。您將看到 PHP 資訊。複製詳細資訊並將其放入嚮導工具,然後點選 Analyze my phpinfo() output 按鈕。

Analyze my phpinfo() output 按鈕

輸出結果如下:

windows pckg

現在,下載 .dll 檔案並按照上述說明將檔案放入 xampp/php/ext 目錄。接下來,按照步驟 3 在 php.ini 檔案中啟用 Xdebug,最後重啟網路伺服器。

MAC

可以使用 pecl 擴充套件安裝 PHP7 Xdebug:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pecl install xdebug
pecl install xdebug
pecl install xdebug

Linux

在 Debian 等 Linux 發行版中,可以使用 Sudo 在 PHP 中安裝 Xdebug:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt install php-xdebug;
sudo apt install php-xdebug;
sudo apt install php-xdebug;

現在,開啟 etc/php/7.0/mods-available/xdebug.ini 檔案,新增以下程式碼啟用 Xdebug:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable = 0
xdebug.remote_enable = 1
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_enable_trigger = 1 xdebug.profiler_enable = 0 xdebug.remote_enable = 1 xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable = 0
xdebug.remote_enable = 1
xdebug.profiler_output_dir = "/tmp"

現在,重新啟動 Apache2 伺服器。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo service apache2 restart;
sudo service apache2 restart;
sudo service apache2 restart;

GIT

你也可以從 GitHub 克隆它。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git clone git://github.com/xdebug/xdebug.git
git clone git://github.com/xdebug/xdebug.git
git clone git://github.com/xdebug/xdebug.git

安裝 Xdebug 後,開啟 php.ini 檔案並啟用擴充套件。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
zend_extension="xdebug.so"
zend_extension="xdebug.so"
zend_extension="xdebug.so"

現在,使用 `php -v` 命令檢查 PHP 版本。您將看到與 PHP 一起安裝的 Xdebug 版本。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php -v
PHP 7.2.0RC6 (cli) (built: Nov 23 2017 10:30:56) ( NTS DEBUG )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies
with Xdebug v2.6.0-dev, Copyright (c) 2002-2017, by Derick Rethans
$ php -v PHP 7.2.0RC6 (cli) (built: Nov 23 2017 10:30:56) ( NTS DEBUG ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies with Xdebug v2.6.0-dev, Copyright (c) 2002-2017, by Derick Rethans
$ php -v
PHP 7.2.0RC6 (cli) (built: Nov 23 2017 10:30:56) ( NTS DEBUG )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies
 with Xdebug v2.6.0-dev, Copyright (c) 2002-2017, by Derick Rethans

在VSCode中配置Xdebug

如果你想使用 Xdebug 實現流暢的工作流程,可以將其整合到你喜歡的整合開發環境中,如 phpstorm、Zend studio 和 VScode。讓我們在 Visual Studio Code 中配置 Xdebug 來除錯 PHP。

VSCode PHP 副檔名為 PHP Debug。你可以在擴充套件視窗中找到並安裝它。

PHP Debug

安裝完成後,必須重新載入 VSCode 視窗。現在,再次執行任何 PHP 檔案中的 phpinfo(); 方法,檢查是否啟用了 Xdebug。

現在點選除錯控制檯選項卡,然後點選 add configuration

在VSCode中配置Xdebug

現在,你必須選擇 PHP 環境。VSCode 將在根目錄下新增 launch.json 檔案。

新增 launch.json 檔案

最後,將 runtimeExecutable 屬性新增到 port 之後的列表中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"runtimeExecutable": "C:\\xampp\\php\\php.exe"
"runtimeExecutable": "C:\\xampp\\php\\php.exe"
"runtimeExecutable": "C:\\xampp\\php\\php.exe"

儲存 launch.json 檔案。開啟除錯模式選項卡,點選綠色除錯按鈕啟動除錯選項。

開啟除錯模式選項卡

現在,您將在視窗中看到幾個專案,透過這些專案,您可以選擇 Xdebugger 將顯示哪些日誌:

  • 通知
  • 警告
  • 錯誤
  • 異常
  • 所有內容

導航至除錯控制檯部分,該部分將顯示錯誤詳情和頂部的除錯執行按鈕。

此時,你可以在需要除錯的程式碼行上新增斷點。請注意,Xdebug 會在左下方新增 PHP 除錯指令碼名稱和行號:

除錯的程式碼行上新增斷點

您可以在瀏覽器中執行應用程式,然後逐行閱讀程式碼,檢視錯誤並正確除錯。此外,你還需要提醒幾個快捷功能鍵,以便在函式和程式碼行中移動:

  • F5:繼續除錯(Continue Debugging)
  • F10:單步跳過(Step Over)
  • F11:進入函式(Step into)
  • Shift + F11:跳出函式( Step out)

xdebug快捷功能鍵

Xdebug效能分析

Xdebug 還提供程式碼效能分析功能,就像其他剖析工具 Blackfire 和 Tideways 一樣。如果要使用分析選項,必須在 php.ini 檔案中啟用它。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
xdebug.profiler_enable=1
xdebug.profiler_output_dir="C:\xampp\tmp"
xdebug.profiler_enable=1 xdebug.profiler_output_dir="C:\xampp\tmp"
xdebug.profiler_enable=1
xdebug.profiler_output_dir="C:\xampp\tmp"

現在,開啟一個檔案,開始輸入所有分析日誌。

小結

除錯是編碼的一個重要方面;沒有除錯,就無法知道程式碼出了什麼問題。

本文演示瞭如何使用 Xdebug 啟用 PHP 除錯並在 VSCode 中進行配置。您還可以將其整合到 Eclipse、PHPstorm 和其他整合開發環境中。

對於那些涉足大量編碼領域的人來說,建立一個強大的除錯環境至關重要。尤其是在處理跨越數千行的複雜應用程式時,安裝一個 PHP 偵錯程式對發現錯誤和警示訊號至關重要。有了先進工具的幫助和 PHP 虛擬主機的可靠性,你就有能力駕馭複雜的編碼,確保無縫的開發體驗。

如果您想了解更多資訊,請在下面的評論部分提出您的疑問和建議。

常見問題

Q. 如何在 PHP 中除錯?

A. 要除錯 PHP,可以使用像Xdebug 這樣的工具,它允許你設定斷點、檢查變數和逐步瀏覽程式碼。基本除錯可以使用 var_dump()print_r() 或 error_log()。要進行更有條理的除錯,可啟用 PHP 錯誤日誌,並使用 Visual Studio Code PhpStorm 等整合開發環境的除錯功能。

Q. 如何啟用 PHP 除錯模式?

A. 要啟用除錯模式,請修改php.ini檔案,設定

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
display_errors = On
error_reporting = E_ALL
display_errors = On error_reporting = E_ALL
display_errors = On
error_reporting = E_ALL

對於生產環境,記錄錯誤而不是顯示錯誤:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
log_errors = On
error_log = /path/to/logfile.log
log_errors = On error_log = /path/to/logfile.log
log_errors = On
error_log = /path/to/logfile.log

Q. PHP 易於除錯嗎?

A. 是的,PHP 很容易使用內建函式進行除錯,如 var_dump()echo 和 print_r()。對於更高階的除錯,Xdebug等工具允許分步除錯、斷點和堆疊跟蹤,從而更容易發現問題。

Q. 如何為 PHP 新增除錯功能?

A. 可以用以下方法為 PHP 新增除錯:

  • 錯誤報告:在指令碼中啟用錯誤報告功能:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    error_reporting(E_ALL); ini_set('display_errors', 1);
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
  • 記錄日誌:配置 PHP 以在 php.ini 中記錄錯誤或使用 error_log('Error message');
  • Xdebug:安裝並配置用於高階除錯的 Xdebug。
  • 除錯功能:使用 var_dump()print_r() 或 debug_backtrace()檢查變數和執行流。

Q. 如何用 Xdebug 和 VSCode 除錯 PHP?

A. 在 VSCode 中使用 Xdebug 除錯 PHP:

  1. 安裝 Xdebug 並配置php.ini
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    zend_extension=xdebug
    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.client_host=127.0.0.1
    xdebug.client_port=9003
    zend_extension=xdebug xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_host=127.0.0.1 xdebug.client_port=9003
    zend_extension=xdebug  
    xdebug.mode=debug  
    xdebug.start_with_request=yes  
    xdebug.client_host=127.0.0.1  
    xdebug.client_port=9003
  2. 在 VSCode 中安裝 PHP Debug 擴充套件。
  3. 在 VSCode 中新增 launch.json 配置檔案。
  4. 在 PHP 程式碼中設定斷點並開始除錯。

Q. 如何在 VSCode 中設定 PHP 除錯可執行路徑?

A. 要在 VSCode 中設定 PHP 的執行路徑,請開啟“設定”並搜尋php.executablePath,然後提供 PHP 安裝的完整路徑,例如

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"php.executablePath": "C:/xampp/php/php.exe"
"php.executablePath": "C:/xampp/php/php.exe"
"php.executablePath": "C:/xampp/php/php.exe"

評論留言