Discuz! 脚本执行时间调试
分类 网站技术/村民张先生 发布于 2025-11-07 14:36
Discuz! 自身的debug工具只显示脚本执行的总时间,无法显示该页面include的脚本的执行时间。可用下面的脚本来查看:
1、保存以下内容到 include_timer.php :
<?php
/**
* PHP 5.6 全自动 include/require 计时器
* 特性:
* - 自动捕获所有被 include/require 的文件
* - 第一条文件耗时正确
* - 输出总耗时 + 每个文件耗时
* - 无需修改其他文件
*/
$GLOBALS['_INCLUDE_TIMER'] = [
'files' => [],
'total' => 0,
'last_time' => microtime(true),
'initialized' => false,
];
// tick 事件,每条语句触发一次
declare(ticks=1);
register_tick_function(function() {
static $lastFile = null;
$includedFiles = get_included_files();
foreach ($includedFiles as $file) {
// 只处理第一次遇到的文件
if (!isset($GLOBALS['_INCLUDE_TIMER']['files'][$file])) {
$now = microtime(true);
if (!$GLOBALS['_INCLUDE_TIMER']['initialized']) {
// 第一条记录耗时设为0
$diff = 0;
$GLOBALS['_INCLUDE_TIMER']['initialized'] = true;
} else {
$diff = $now - $GLOBALS['_INCLUDE_TIMER']['last_time'];
}
$GLOBALS['_INCLUDE_TIMER']['files'][$file] = $diff;
$GLOBALS['_INCLUDE_TIMER']['total'] += $diff;
$GLOBALS['_INCLUDE_TIMER']['last_time'] = $now;
}
}
});
// 页面结束时输出
register_shutdown_function(function() {
$files = $GLOBALS['_INCLUDE_TIMER']['files'];
$totalTime = microtime(true) - $GLOBALS['_INCLUDE_TIMER']['last_time'];
echo "<pre style='background:#111;color:#0f0;padding:10px;font-size:13px'>";
echo "PHP Include Timer (PHP 5.6)\n";
echo str_repeat('-', 60) . "\n";
foreach ($files as $file => $time) {
printf("%8.4f s %s\n", $time, $file);
}
echo str_repeat('-', 60) . "\n";
printf("Total include time: %.4f s\n", array_sum($files));
printf("Total page execution time (approx): %.4f s\n", $totalTime);
echo "<"."/pre>";
});
2、在入口文件引入上述文件,例如 forum.php 中(必须放在最前面):
declare(ticks=1); include_once './include_timer.php';
3、暂时关闭PHP的 OPcache 等缓存扩展(重要),然后正常访问页面,底部会出现所包含的每个脚本及其执行时间。
欢迎谈谈你的看法(无须登录) *正文中请勿包含"http://"否则将被拦截