<?php
/**
* 代碼執(zhí)行時間跟蹤器
*/
class Tracker
{
/**
* 記錄執(zhí)行代碼次數(shù)
* @var int
*/
protected $eval_code_line_num = 0;
/**
* 記錄執(zhí)行代碼開始時間(毫秒時間戳)
* @var int
*/
protected $eval_code_time = 0;
/**
* 執(zhí)行代碼過慢時間(單位毫秒)
* @var int
*/
protected $slow_code_time = 200;
/**
* 獲取當前時間(毫秒時間戳)
* millisecondTime
* @return float|int
*/
protected function millisecondTime()
{
return microtime(true) * 1000;
}
/**
* 設置執(zhí)行代碼過慢時間(單位毫秒)
* @param $time
* @return Tracker
* @throws Exception
*/
public function setSlowCodeTime($time)
{
if ($time <= 0) {
throw new \Exception('執(zhí)行代碼過慢時間必須大于0');
}
$this->slow_code_time = $time;
return $this;
}
/**
* startCollect
* @throws Exception
*/
public function startCollect()
{
declare (ticks=1);
if (!register_tick_function([$this, 'handle'])) {
throw new \Exception('注冊tracker處理函數(shù)失敗');
}
}
/**
* handle
*/
public function handle()
{
// 記錄執(zhí)行代碼次數(shù)+1
$this->eval_code_line_num++;
// 獲取當前時間(毫秒時間戳)
$millisecondTime = $this->millisecondTime();
// 記錄執(zhí)行代碼開始時間(毫秒時間戳)
if (!$this->eval_code_time) {
$this->eval_code_time = $millisecondTime;
}
// 當前時間 - 執(zhí)行代碼開始時間 > 執(zhí)行代碼過慢時間 : 說明執(zhí)行當前行的代碼執(zhí)行過慢
if (($millisecondTime - $this->eval_code_time) > $this->slow_code_time) {
$e = new \Exception();
$ret = $e->getTrace()[0] ?? [];
$ret['eval_code_line_num'] = $this->eval_code_line_num;
var_dump($ret);
die();
} else {
$this->eval_code_time = $millisecondTime;
}
}
}
// 在其他文件中的使用示例 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
// 引入代碼執(zhí)行時間跟蹤器類
include_once "./Tracker.php";
// 設置執(zhí)行指令ticks=1(這個一定不能少)
declare(ticks=1);
// 查詢執(zhí)行超過10毫秒的代碼位置
$object = new Tracker();
$object->setSlowCodeTime(10)->startCollect();
// 寫個循環(huán)100次
for ($i = 1;$i <= 100;$i++){
if($i == 10){
// 延遲10毫秒(usleep函數(shù)的值是微妙,1000微妙=1毫秒)
usleep(10000);
}
}
*/
php使用register_tick_function來定位執(zhí)行慢的代碼
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 使用Diagnostics.Stopwatch,獲取當前實例測量得出的運行時間,以毫秒為單位,直接上代碼:
- 腳本 用法 ./run.sh 或 bash run.sh 效果 獲取一段代碼的執(zhí)行時間,累計到總執(zhí)行時間,輸出到...