通常來說,程式常常會有兩種問題:邏輯問題與性能問題。至於 Syntax Error 這種低級問題根本還算不上程式的問題
為了確定 PHP 程式中的性能瓶頸所在,我們通常會依靠 Profiler,找出是什麼時候、什麼函式、傳入了什麼參數以及花費了多少時間,甚至還能看到整個應用程式的生命周期間用了多少的記憶體、CPU、磁碟 IO 或網路 IO。
PHP 老牌的 Debugger 其實也具備 Profiler 的功能,然而因為對於性能有極大的影響所以只能在開發環境中使用。
在安裝 xdebug 之後,可在 php.ini
中加入以下設定以啟用 xdebug profiler:
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = /tmp/xdeubg/profiler
xdebug.profiler_enalbe = 0
:不讓 Xdebug Profiler 自動啟動,否則在執行其它 PHP 程式時也會自動啟動(例如 composer 或 phpunit)xdebug.profiler_enable_trigger = 1
:在 HTTP REQUEST 或在 COOKIE 裡加入 XDEBUG_PROFILER=1
,即可在單個請求中啟動 Xdebug Profilerxdebug.profiler_output_dir
:指定 profiling 的結果會放到哪個資料夾,profiling 的資料通常不小,記得指定一個具備足夠空間的磁碟
Xdebug Profiler 生成的結果是 CacheGrind 格式,我個人是偏好使用 KCacheGrind。
XHProf 原本是 Facebook 開源的 Profiling 工具,然而它並沒有跟著 PHP 7 一起釋出新版。
目前由 Tideways Fork 出來的版本成為主流(Tideways 原本就是做 Profiling/Tracing as a Service 服務),雖然 Tideways 屬於商業導向的公司,但其 XHProf 仍是開源使用,只要不使用他們的服務其實是不會收費的。
詳細的安裝及使用方式可以參閱 tideways/php-xhprof-extension
XHProf 所產生的結果是自有的結構,通常會依靠 XHGUI 來做分析
與 Xdebug 相比,它收集的資料較少,但是因為效率比較高,所以可以在正式環境中使用。
Blackfire 由 Symfony 主導,它可以收集的資料量約在 Xdebug 與 XHProf 之間,但是它的免費使用僅有開發版本(最便宜的每月 29 美金,需年付)
Blackfire 因為經過多次版本更迭,不確定我的記憶是否與目前有所出入,如有出入以官方為主。
Blackfire 會在作業系統中安裝兩個東西:profiler php extension 與 agent。利用 profiler extension 收集相關資訊後再使用 agent 將資料傳回 blackfire 做可視化,同時有提供 chrome extension 可以即時操作。
這個是我昨天在看 Swoole 4.3 的新版資料時偶然發現的,該系統由 Swoole 開發團隊所建置,定位上有點類似於 Blackfire,在沒有要求 clickhouse 支援的情況下可以免費使用(要求 clickhouse 支援的話一年是 5 萬人民幣)
Swoole Tracker 以 XHProf 為基礎並經過一些魔改以適應 swoole(上面寫的所有 profiler 都無法用於 swoole)。
詳細的介紹可以直接參閱官方的 Demo 影片:https://www.swoole-cloud.com/tracker.html
在 Modern PHP 一書中對於 Profiler 還有提到 New Relic,不過因為我沒使用過所以略過不提。
事實上,當時 Facebook 在 PHP7 釋出之後遲未更新 XHProf 我還以為這個 profiler 就被放棄了。所幸有 tideways 接下維護的工作,至於如果有一天 tideways 倒閉,是否還有其它人願意接手就不得而知了。
Blackfire 因為後面由 Symfony 撐腰,而且已經活躍了五、六年了應該算是比較穩定的選擇;Swoole Tracer 算是後起之秀的新型服務,我很期待它未來的發展。