當一段程式碼看不到完整的呼叫連結,你是否需要一個工具來輔助明確地查詢到整個完整的呼叫鏈。這次小編帶你了解php中的Deliverer,以後再也不用擔心程式碼排查。
前幾日有位群友接手一段祖傳程式碼,排查很久沒有解決,準備提桶跑路,最後幫其解決,完整的過程見https:/ /mengkang.net/1470.html 但最後程式碼的定位我有一些基於個人經驗,實際呼叫的連結和我預期的不一樣,都是靠猜。沒有看到完整的呼叫鏈路,所以我想著需要一個工具來輔助明確地查詢到整個完整的呼叫鏈。
所以搞了這麼個工具,主要是用於一些不熟悉的項目,而且日常環境不好復現的線上場景。
deliverer 祖傳程式碼跑路拯救者https://github.com/zhoumengka...
如果你的專案不是那麼糟糕,日常環境都ok,那麼熟悉一個專案最好的方式還是xdebug,這個工具主要是在排查線上問題。
類似的工具有360 的phptrace 實作原理上稍微有點不同
可以根據函數名稱、類別名稱、方法名稱、路由來過濾輸出
可以在查詢到指定過濾內容n 次之後退出
可以根據request id 回放細看整個完整的呼叫鏈
過濾的內容會高亮顯示
呼叫堆疊比較深的可以指定-l 來隱藏深度呼叫的展示
其實比較簡單,分兩步,第一步收集日誌,第二步分析日誌。
在PHP_MINIT階段,透過zend_set_user_opcode_handler 來設定 ZEND_DO_UCALL 、ZEND_DO_FCALL_BY_NAME、ZEND_DO_FCALL 三類 opcode 的處理分析。
注意其中會涵蓋一些內建函數和方法的調用,我們可以透過型別進行過濾。
然後在PHP_RINIT階段新日誌文件,寫入請求的資訊
pid-ts sapi http_method http_url
請求過程中在自訂的handler 裡面列印呼叫堆疊資訊
最後在PHP_RSHUTDOWN關閉日誌文件的寫入
對收集好的日誌,利用bin/deliverer進行分析和整理,這塊是php 腳本,就不贅述了。
$ phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config $ make && sudo make install
追加
[deliverer] extension=deliverer.so
sudo service php-fpm restart
可以移動./bin/deliverer到你覺得合適的目錄,假如在當前目錄
$ chmod +x deliverer
用一段我自己很久之前的祖傳代碼(我的博客)來跑下
$ ./bin/deliverer -t
這樣會一直監控所有的php 進程的執行
$ ./bin/deliverer -tAction::initUser -n3 -l5
#值 | 解釋 | |
---|---|---|
-t | #Action::initUser | 過濾包含該呼叫的請求 |
-n | 3 | 統計三次然後退出 |
-l | # 5 | 函數(方法)呼叫深度顯示,最多顯示5 層,超出部分在末尾標記 |
$ ./bin/deliverer -v7979-1624369150991941
透過-v requestId 來詳細查看完整呼叫堆疊
$ ./bin/deliverer -tSqlExecute::getAll -n1 -l3
當要查詢方法,函數呼叫堆疊過深,不在層級查詢範圍之內,則其外層呼叫顯示紅色
推薦學習:php影片教學
#以上是等了這麼久的PHP程式碼拯救者Deliverer,來咯!的詳細內容。更多資訊請關注PHP中文網其他相關文章!