什麼叫在線調試?就是在線上生產環境進行調試,假設有一天某個用戶報某個頁面某個數據怎麼不對啊,看來線上出BUG了,因而你要迅速找出緣由,首先看日誌,但是悲劇的沒有足夠的日誌讓你肯定線上BUG的緣由,也許你這時想看某個PHP變量的值,但是你敢在線上環境加個 echo? 出問題了,你就要下崗了,若是用線下環境,但是數據環境不一樣,可能難以復現線上的BUG呢,這個php在線調試工具就是爲解決這種問題而生,可讓你方便地查看任意線上PHP變量的值而不用改動代碼,就像C的調試工具gdb那樣,如下叫它ydb。php
ydb採用擴展實現,在url中輸入相關調試參數,便可查看相關變量值,參數包括類名,函數名,變量等。ydb不但可讓你查看任意變量值,並且能夠查看函數執行耗時狀況,也就是不但能夠用來排除業務邏輯BUG,也能夠用查看性能問題。你也許擔憂一個擴展放在線上是否會影響性能,它實際上對性能的影響極小,實際相關計算都是調試者自己產生,若是你以爲極小的性能影響也不能容忍,那能夠在調試時再加上該擴展,重啓下php進程便可。html
下面來看看ydb的具體使用git
假設有以下代碼在index.php中是咱們的調試對象github
<?php class CB { private $pv = 'abc'; function add($a,$b){ return $a+$b; } } class CA { public function look_value($pa,$pb){ $fa = $pa; $fb = $pb; $fc = $fa+$fb; $arr = array(1,2,3); $objCb = new CB(); $fd = $objCb->add(3,4); $arr = array(4,5,6); return $fd; } function look_cost(){ $this->fun1(); $this->fun2(); $this->fun3(); usleep(300000); } function fun1(){ usleep(100000); return; } function fun2(){ usleep(200000); return; } function fun3(){ usleep(500000); return; } } $objAt = new CA(); $res = $objAt->look_value(1, 2); $res = $objAt->look_cost(); echo "should not be here";
假設咱們要查看類CA函數look_value中變量arr的值
咱們須要在瀏覽器中輸入以下url: http://php.wenda.so.com/index.php?c=CA&f=look_value&v=arr ,
各參數意義以下
c : 表示類名
f : 表示函數名
v: 表示你想查看的變量名
鍵入url的結果是 瀏覽器
從結果能夠看出值是arr第二次的賦值,因此ydb的顯示值都是函數執行完畢變量最後的值(什麼?你想看中間值,之後會有的)。函數
另外,若是不輸入v參數,則會打印出函數中的全部變量,輸入http://php.wenda.so.com/index.php?c=CA&f=look_value的結果以下所示工具
能夠看到函數look_value中的全部變量包括參數及對象的值都打印出來了post
上面說的是get請求,若是是post請求,那該怎麼辦呢?一樣是在url中輸入參數,該 url打開提交的表單,在提交表單時,便可打印相應變量值,不過加上參數o標識這是一個post表單請求,這樣就不會在當前請求中進行變量打印了。打開url: http://php.wenda.so.com/post.html?c=CA&f=look_value&o=1,顯示錶單:性能
點提交按鈕後,一樣打印類函數look_value中的值,與get請求中同樣,以下圖所示this
擴展中即經過讀取post請求的refer值來實現變量值打印。
有時你不想把相關值顯示在瀏覽器上而影響頁面的正常展現,而想打印在日誌文件中,這時你能夠在url中添加l=1參數便可將相關變量輸出打印在日誌文件中,日誌文件是log/ydbinfo.log,在php安裝根目錄中。
ydb能夠查看某個函數中全部執行子函數的從高到低的執行耗時排行以及該函數執行的總耗時,經過一個個函數跟蹤下去,就很容易找出系統的瓶頸在哪,到底哪一個函數執行花費了最長時間。
查看執行耗時,也要輸入 c,f參數,表示要查看哪一個類的哪一個函數的耗時狀況,另外須要加上t=1參數,表示是查看耗時,而不是查看變量值。繼續使用以前index.php中的代碼,輸入url : http://php.wenda.so.com/index.php?c=CA&f=look_cost&t=1,便可看到以下結果
最上面一行表示look_cost總的耗時,接下來是look_cost中調用的三個函數耗時從大到小的耗時排行,在實際狀況中,咱們能夠進一步將f參數改成耗時最大的那個子函數,一步步跟蹤找到系統瓶頸所在。
對於post請求以及打印信息到日誌中,查看耗時與查看變量值同樣,相應使用o,l參數便可。
該擴展已放在github 上 https://github.com/micweaver/ydb,php5.3以上版本使用Makefile5.3編譯,php5.2版本使用Makefile5.2編譯,將Makefile中的php源碼路徑改成本身目錄實際路徑,編譯獲得ydb.so文件便可,而後在php.ini文件中加入以下配置,重啓php進程就可使用拉。
zend_extension=」ydb.so文件的路徑 」