Xdebug 是 PHP 開發者必備的調試擴展,支援斷點、單步執行、變量檢查、堆疊追蹤、覆蓋率分析等功能。本文詳細講解如何在遠程/虛擬機/容器環境中配置 Xdebug 3,並整合 PhpStorm/IntelliJ IDEA 實現高效遠程調試。
| 角色 | IP/主機 | 說明 |
|---|---|---|
| 開發機 (IDE) | 192.168.1.100 | 運行 PhpStorm,監聽 9003 端口 |
| 測試伺服器 | 192.168.1.200 | 運行 PHP-FPM + Nginx,代碼部署在 /var/www/app |
| 專案代碼 | 本地 /home/user/project | 與伺服器 /var/www/app 內容同步(Git/rsync/掛載) |
# Ubuntu/Debian apt-get update && apt-get install -y php-xdebug # CentOS/RHEL/Rocky/AlmaLinux yum install -y php-pecl-xdebug # 或通過 PECL 安裝最新版 pecl install xdebug-3.3.1 # 驗證安裝 php -m | grep xdebug php -v # 應顯示:with Xdebug v3.3.1, Copyright (c) 2002-2023, by Derick Rethans
編輯 /etc/php/8.1/fpm/conf.d/20-xdebug.ini 或 /usr/local/php/etc/php.ini:
[xdebug] ; 基礎啟用 zend_extension=xdebug.so xdebug.mode=debug,develop,trace,profile ; 遠程調試核心配置 xdebug.client_host=192.168.1.100 ; IDE 所在 IP(開發機) xdebug.client_port=9003 ; IDE 監聽端口(Xdebug 3 預設 9003) xdebug.start_with_request=yes ; 自動發起調試連接(trigger 可配合瀏覽器擴展) xdebug.discover_client_host=false ; 不自動檢測 $_SERVER['HTTP_X_FORWARDED_FOR'] xdebug.log=/var/log/xdebug.log ; 調試日誌(排查連接問題關鍵) xdebug.log_level=7 ; 日誌詳盡度 0-10 ; 性能與輸出 xdebug.max_nesting_level=256 xdebug.var_display_max_depth=5 xdebug.var_display_max_children=256 xdebug.var_display_max_data=1024 ; IDE Key(瀏覽器擴展觸發用) xdebug.idekey=PHPSTORM
| 參數 | Xdebug 2 | Xdebug 3 | 說明 |
|---|---|---|---|
| 遠程主機 | xdebug.remote_host | xdebug.client_host | IDE IP,支援主機名 |
| 遠程端口 | xdebug.remote_port | xdebug.client_port | 預設 9000→9003 |
| 啟用遠程 | xdebug.remote_enable=1 | xdebug.mode=debug | 模組化啟用 |
| 自動啟動 | xdebug.remote_autostart=1 | xdebug.start_with_request=yes | yes/trigger/request |
| 回連模式 | xdebug.remote_connect_back=1 | xdebug.discover_client_host=true | 自動檢測客戶端 IP |
重啟 PHP-FPM 生效:systemctl restart php8.1-fpm 或 service php-fpm restart
Settings/Preferences → PHP → CLI Interpreter → 配置遠程解釋器(SSH/Vagrant/Docker/WSL)Settings → PHP → Servers → 新增 Server:
Remote Server192.168.1.200 (或域名)/home/user/project ↔ 伺服器路徑 /var/www/appRun → Edit Configurations → + → PHP Remote DebugRemote DebugRemote ServerPHPSTORM (與 php.ini 一致)| 現象 | 原因 | 解決 |
|---|---|---|
| IDE 無反應,無調試面板 | Xdebug 無法連接 IDE 端口 | 1. 檢查防火牆:開發機開放 9003 入站 2. 查看 xdebug.log 是否有 Connecting to 192.168.1.100:90033. 確認 xdebug.client_host 為開發機真實可達 IP |
| 斷點不生效,直接跑完 | 路徑映射錯誤 | 檢查 Server 配置的 Path Mappings:本地項目根目錄 ↔ 伺服器 DocumentRoot 完全對應 |
| 變量顯示亂碼/無法展開 | 編碼不一致 | 確保 PHP 文件 UTF-8 無 BOM,IDE 專案編碼設為 UTF-8 |
| 調試極慢/卡頓 | xdebug.mode 開啟過多模組 | 僅開啟 xdebug.mode=debug,關閉 profile/trace |
| 多站點共用一台伺服器 | IDE Key 衝突 | 各站點設置不同 xdebug.idekey,PhpStorm 配置對應 Debug Config |
若開發機在內網/NAT 後,伺服器無法直接連接,建立 SSH 反向隧道:
# 在開發機執行(需保持終端開啟) ssh -R 9003:localhost:9003 user@192.168.1.200 -N -T # 伺服器 php.ini 配置 xdebug.client_host=127.0.0.1 xdebug.client_port=9003 # 此時 Xdebug 連接伺服器本地 9003,經 SSH 隧道轉發到開發機 9003
# docker-compose.yml
services:
php:
build: .
volumes:
- ./src:/var/www/html
environment:
XDEBUG_MODE: debug
XDEBUG_CLIENT_HOST: host.docker.internal # Docker Desktop 專用
XDEBUG_CLIENT_PORT: 9003
XDEBUG_START_WITH_REQUEST: yes
XDEBUG_IDEKEY: PHPSTORM
# Linux 原生 Docker 需額外配置:
# extra_hosts:
# - "host.docker.internal:host-gateway"
PHPSTORM,點擊圖標切換 Debug 狀態(綠色蟲子)xdebug.start_with_request=trigger,僅在需要時啟動調試,避免每請求都連接 IDE 影響性能trigger 模式xdebug.mode=debug 僅開啟調試,profile/trace 極大拖慢性能xdebug.var_display_max_depth=3 減少傳輸數據量zend_extension=opcache.so 在 zend_extension=xdebug.so 之前php -m | grep xdebug 可見client_host、client_port、start_with_request、idekeyxdebug.log 記錄連接嘗試完成上述配置,即可享受如同本地開發般的遠程斷點調試體驗,大幅提升排查複雜業務邏輯、異常堆疊、性能瓶頸的效率。