首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 程式碼執行時間剖析:全域計時器精準定位效能瓶頸

     編輯:PHP 綜合知識

核心思路

在關鍵程式碼段落插入計時點,記錄微秒時間與標籤,最後統計相鄰兩點差值,輸出或寫入日誌,快速找出耗時區塊。

實作代碼

<?php
// 全域計時器 ID
$_timer_id = 0;

/**
 * 記錄計時點
 * @param string $notes 標籤 (建議含 __LINE__)
 * @param bool $onOff 開關,正式環境可設 false 關閉
 */
function makeTimer($notes, $onOff = FALSE) {
    if ($onOff) {
        global $_timer_id;
        $GLOBALS['timer'][$_timer_id][0] = microtime(TRUE);
        $GLOBALS['timer'][$_timer_id][1] = $notes;
        $_timer_id++;
    }
}

/**
 * 輸出所有區間耗時
 * @return string 格式化報表
 */
function traceTimer() {
    $timer_str = '';
    $G_timer = count($GLOBALS['timer']) - 1;
    if ($G_timer > 0) {
        for ($i = 0; $i < $G_timer; $i++) {
            $dif = number_format($GLOBALS['timer'][$i+1][0] - $GLOBALS['timer'][$i][0], 3);
            $timer_str .= "dif: {$dif} {$GLOBALS['timer'][$i][1]}\n";
        }
        // 最後一點到現在
        $dif = number_format(microtime(TRUE) - $GLOBALS['timer'][$G_timer][0], 3);
        $timer_str .= "dif: {$dif} {$GLOBALS['timer'][$G_timer][1]}\n";
    }
    return $timer_str;
}
?>

使用範例

<?php
// 開啟計時
makeTimer(' LINE:' . __LINE__, true);

$imgstrpos = strpos($str, '<img' . $imgstr);
makeTimer(' LINE:' . __LINE__, true);

$str_p = substr($str_noimg, 0, $imgstrpos);
makeTimer(' LINE:' . __LINE__, true);

$str_n = substr($str_noimg, $imgstrpos, strlen($str_noimg));
makeTimer(' LINE:' . __LINE__, true);

$pst_exc_imgs = $str_p . '<img ' . $imgstr . '>' . $str_n . " ";
makeTimer(' LINE:' . __LINE__, true);

// 輸出或記錄
error_log(traceTimer(), 3, '/tmp/' . basename(__FILE__) . '.log');
// 或直接 echo traceTimer();
?>

輸出範例

dif: 0.001 LINE:12
dif: 0.003 LINE:14
dif: 0.000 LINE:16
dif: 0.002 LINE:18
dif: 0.001 LINE:20

進階建議

  • 封裝為類別,支援巢狀區間、記憶體用量記錄 (memory_get_usage())。
  • 搭配 auto_prepend_file / auto_append_file 全站無侵入式植入。
  • 生產環境採樣率 1% 記錄,避免 I/O 壓力。
  • 長期專案請改用 Xdebug Profiler、Blackfire、Tideways 等專業 APM 工具。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved