首頁  >  文章  >  後端開發  >  等了這麼久的PHP程式碼拯救者Deliverer,來咯!

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

醉折花枝作酒筹
醉折花枝作酒筹轉載
2021-06-24 16:05:491897瀏覽

當一段程式碼看不到完整的呼叫連結,你是否需要一個工具來輔助明確地查詢到整個完整的呼叫鏈。這次小編帶你了解php中的Deliverer,以後再也不用擔心程式碼排查。

等了這麼久的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

設定php.ini

追加

[deliverer]
extension=deliverer.so

重啟php-fpm

sudo service php-fpm restart

使用分析工具

可以移動./bin/deliverer到你覺得合適的目錄,假如在當前目錄

$ chmod +x deliverer

用一段我自己很久之前的祖傳代碼(我的博客)來跑下

$ ./bin/deliverer -t

這樣會一直監控所有的php 進程的執行

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

$ ./bin/deliverer -tAction::initUser -n3 -l5

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

#值 解釋
-t #Action::initUser 過濾包含該呼叫的請求
-n 3 統計三次然後退出
-l # 5 函數(方法)呼叫深度顯示,最多顯示5 層,超出部分在末尾標記
$ ./bin/deliverer -v7979-1624369150991941

透過-v requestId 來詳細查看完整呼叫堆疊

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

$ ./bin/deliverer -tSqlExecute::getAll -n1 -l3

當要查詢方法,函數呼叫堆疊過深,不在層級查詢範圍之內,則其外層呼叫顯示紅色

等了這麼久的PHP程式碼拯救者Deliverer,來咯!

推薦學習:php影片教學

#

以上是等了這麼久的PHP程式碼拯救者Deliverer,來咯!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除