簡體   English   中英

Xdebug 無法連接到客戶端,從哪里開始調試調試器?

[英]Xdebug unable to connect to client, where do I start debugging the debugger?

我正在 sublime 文本中為 php 設置 xdebug,並且 xdebug 不斷記錄與無法連接相關的錯誤:

Log opened at 2016-08-18 21:06:01
I: Connecting to configured address/port: localhost:9988.
E: Could not connect to client. :-(
Log closed at 2016-08-18 21:06:01

我希望通過在瀏覽器中直接訪問http://localhost:9988進行調試可能會有所幫助,但它只會顯示谷歌瀏覽器錯誤頁面:“localhost 拒絕連接”。 也許另一端存在錯誤,無法將數據推送到 sublime text 客戶端,我不知道。 當我運行測試/等時,崇高的文本 xdebug 確實顯示消息“正在重新加載 /var/log/xdebug/xdebug.log”,所以它似乎知道正在運行的 php 代碼,只是沒有進一步。

所以,我從沒想過我必須調試 xdebug 本身,但是:如何調試 xdebug 到代碼編輯器的連接? 如果這是 nginx,我會開始調試虛擬主機,但因為它是 xdebug... ...我不知道從哪里開始調試缺少要連接的應用程序?

##各種配置設置##

我在 ubuntu linux 14.04 上。

如果相關,這是我的 xdebug.ini conf:

[xdebug]
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host="localhost"
xdebug.remote_handler="dbgp"
xdebug.remote_port=9988
xdebug.remote_mode = req
xdebug.overload_var_dump=0
xdebug.idekey = sublime.xdebug
xdebug.remote_log="/var/log/xdebug/xdebug.log"
;https://github.com/martomo/SublimeTextXdebug

Xdebug 安裝:

apt-cache policy php-xdebug
php-xdebug:
  Installed: 2.4.0-5+donate.sury.org~trusty+1
  Candidate: 2.4.0-5+donate.sury.org~trusty+1
  Version table:
 *** 2.4.0-5+donate.sury.org~trusty+1 0
        500 http://ppa.launchpad.net/ondrej/php/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

模塊激活:

php -m | grep -i xdebug
xdebug
Xdebug

phpinfo xdebug 設置:

通過 phpinfo 進行 xdebug 設置

PHP 調試需要兩個協作的組件:一個充當服務器的 PHP 擴展和一個知道如何與此擴展通信並驅動其功能的軟件(它是客戶端)。

然而,盡管客戶端連接到服務器的常用客戶端-服務器協議,PHP 調試器的工作方式相反:服務器是連接到客戶端的服務器(應該啟動並偵聽端口9000 )。

xdebug是最著名的用於調試的 PHP 擴展。 有許多程序和程序擴展/插件充當它的客戶端。 我沒有使用 Sublime 的 Xdebug 包(首先我沒有使用 Sublime),但原理是相同的。

調試會話如何工作?

客戶端軟件(在您的案例中帶有 Xdebug 包的 Sublime)開始偵聽localhost端口9000 ,等待服務器啟動連接。 它可能不會一直監聽端口,而是只有在開發人員告訴它時才會監聽。

您啟動 PHP 腳本進行調試。 xdebug不會啟動對服務器的所有請求,但僅當它在請求中找到標記時才會啟動。 根據用於運行腳本的 SAPI,標記是環境變量(對於 CLI 腳本)或 cookie 或GETPOST參數(對於網頁)。 閱讀文檔的“啟動調試器”部分的更多信息。

當 PHP 解釋器開始執行 PHP 腳本時,如果xdebug找到了上面解釋的標記,那么它會嘗試連接xdebug客戶端。 否則,它會避開並讓腳本全速運行。

當調試標記存在於環境中時, xdebug擴展(服務器)嘗試連接到xdebug客戶端(默認情況下在localhost端口9000 ,但可以根據需要更改這些設置)。 如果它無法連接(因為客戶端未在偵聽),則它會記錄故障,然后將自己排除在外並讓腳本全速運行。

在它成功連接到客戶端后, xdebug PHP 擴展要么在運行 PHP 腳本的第一條語句之前停止,要么運行腳本直到它的執行到達斷點。 此行為和斷點列表由客戶端在建立連接時的初始通信期間發送到服務器。 然后擴展等待來自客戶端的命令。 客戶端向開發人員顯示正在運行的腳本的當前狀態(要運行的下一條語句、當前范圍內變量的值等)並等待命令(運行下一條語句、繼續、添加/刪除斷點、觀察一些變量等)。

為什么它不適合你?

從您的問題中我不是很清楚,但我假設您在運行xdebug客戶端( localhost )的同一台計算機上運行網絡服務器(帶有 PHP 解釋器和xdebug擴展)。 如果情況並非如此,請不要絕望。 解決方案是一個命令行(在答案末尾閱讀)。

從您在問題中發布的信息來看,很明顯xdebug已安裝、啟用並且可以正常工作。 telnet localhost 9988的輸出表示沒有人在監聽端口9988 xdebug客戶端應該在那里監聽。

我從未使用過 Sublime Text(及其包)。 本文介紹了如何安裝並使其工作。 但是,它沒有解釋如何配置它以偵聽端口9988

我首先將 PHP xdebug擴展設置為連接到默認端口 ( 9000 ):

xdebug.remote_port=9000

然后,如果一切正常,我會嘗試找出如何配置 Sublime Text xdebug包以偵聽不同的端口。 你真的需要它來監聽不同的端口嗎?

如果 web 服務器和xdebug客戶端在不同的計算機上怎么辦?

如果您需要調試在遠程機器上運行的 PHP 腳本, xdebug客戶端會在本地機器上偵聽(在端口9000 ),而xdebug擴展會嘗試連接到遠程機器上的端口9000 Intranet 和 VPN 中可能的解決方案是配置xdebug以連接到本地機器的端口9000 ,但除了這些條件之外,它通常還需要更改防火牆和/或其他安全軟件。

調試在這種情況下,PHP腳本,如果你有最簡單的方法ssh遠程計算機訪問是創建一個ssh從隧道端口9000的遠程計算機的端口9000的本地機。

假設您使用ssh連接到遠程機器(將文件放在上面),您所要做的就是將-R 9000:localhost:9000附加到用於連接並啟動到遠程的ssh會話的命令行機。

只要這種連接是打開的,在端口的任何連接請求9000 (第一9000的遠程計算機(上面在命令行上) -R )通過隧道轉發到端口9000 (第二9000從命令行)本地機器( localhost )。 這樣遠程xdebug PHP 擴展就能夠聯系遠程xdebug客戶端(假設它正在監聽)。

好的,在對不同設置進行了大量測試后,以下是我為追隨我的人調試問題的建議:

  1. 不要依賴僅使用 1 個 xdebug 客戶端進行測試! 安裝兩個編輯器/IDE 是微不足道的,所以運行一個備用編輯器,以便可以查看 xdebug 或特定客戶端是否有問題!

  2. xdebug+xdebug 客戶端組合的配置可以有3 個位置! 客戶端(或編輯器插件)配置、20-xdebug-conf.ini 文件(或在 php.ini 中的等效文件)和您的項目特定配置。 確保所有 3 個位置在端口、路徑映射等方面都是同步的。

如果您使用的是xdebug-v3 ,請嘗試:

xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=1

這應該可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM