Xhprof 是 Facebook 開源的輕量級 PHP 性能分析工具,類似 Xdebug 但開銷極低,可安全運行於生產環境,並支援通過代碼控制開關。本文記錄從源碼編譯安裝到生成可視化報告的完整流程。
# 1. 下載源碼包(以 0.9.3 版為例) wget https://pecl.php.net/get/xhprof-0.9.3.tgz # 2. 解壓並進入擴展目錄 tar zxf xhprof-0.9.3.tgz cd xhprof-0.9.3/extension # 3. 生成 configure 腳本(需 phpize,路徑根據實際 PHP 安裝位置調整) /usr/bin/phpize # 4. 配置編譯參數(php-config 路徑同理) ./configure --with-php-config=/usr/bin/php-config # 5. 編譯並安裝 make && sudo make install # 擴展文件 xhprof.so 會自動複製到 PHP 擴展目錄(如 /usr/lib64/php/modules)
; 根據 phpinfo 確認 extension_dir extension=xhprof.so ; 指定分析數據輸出目錄(需可寫權限) xhprof.output_dir=/tmp/xhprof
修改後重啟 PHP-FPM 或 Apache:sudo /etc/init.d/httpd restart(或 systemctl restart php-fpm)。
查看 phpinfo() 輸出,搜索 "xhprof" 確認擴展已加載。
<?php // 1. 啟用分析(可選標誌位組合) xhprof_enable(); // xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); // 忽略內置函數 // xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); // 同時分析 CPU 與內存 // --- 待測試的業務代碼區塊 --- // ... // --------------------------- // 2. 停用並獲取原始數據 $xhprof_data = xhprof_disable(); // 3. 保存運行數據並生成報告鏈接 $xhprof_root = '/var/www/xhprof/'; // 虛擬主機指向的 xhprof 目錄 include_once $xhprof_root . "xhprof_lib/utils/xhprof_lib.php"; include_once $xhprof_root . "xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof"); echo '<a href="https://xhprof.example.com/xhprof_html/index.php?run=' . $run_id . '&source=xhprof" target="_blank">查看 Xhprof 分析報告</a>'; ?>
將源碼包中的 xhprof_html 和 xhprof_lib 目錄複製到可訪問的 Web 目錄:
cp -r xhprof_html xhprof_lib /var/www/xhprof/
在 Nginx/Apache 中配置虛擬主機指向 /var/www/xhprof,即可通過瀏覽器訪問報告。
| 欄位 | 含義 |
|---|---|
| Function Name | 函數名 |
| Calls | 調用次數 |
| Incl. Wall Time (microsec) | 包含子函數的總耗時(微秒) |
| Excl. Wall Time (microsec) | 函數自身耗時(不含子函數) |
| Incl. CPU / Excl. CPU | CPU 佔用時間(含/不含子函數) |
| Incl. MemUse / Excl. MemUse | 內存佔用(含/不含子函數,字節) |
| Incl. PeakMemUse / Excl. PeakMemUse | 峰值內存佔用 |
調用圖:點擊 [View Full Callgraph] 可生成 Graphviz 圖形化調用鏈,紅色節點代表最大性能瓶頸,黃色次之。若報錯請安裝:yum install -y graphviz graphviz-gd。
if (mt_rand(1, 100) === 1) xhprof_enable(); 實現 1% 採樣。xhprof.output_dir 目錄下舊的運行數據文件,防止磁盘佔滿。save_run($data, "source_name") 的第二個參數用於區分不同項目/模塊(如 "api", "backend", "cron")。Excl. Wall Time 和 Excl. MemUse 確認效果。yum install graphviz