应优先使用 php 7.3+ 原生 hrtime() 替代已停止维护的 php-timer,它纳秒级精准、无浮点误差、零依赖;若需高级功能,可用 symfony 生态或自建基于 hrtime() 的 timer 类。

直接用 composer require 安装 PHP-Timer,但注意它不维护了
PHP-Timer(php-timer/php-timer)确实能做微秒级计时,但它自 2017 年起已停止维护,最新版仅支持 PHP 5.6–7.1。如果你用的是 PHP 7.2+ 或 8.x,composer require php-timer/php-timer 会失败或触发兼容性警告——不是命令不对,是底层依赖(如 phpunit/phpunit 版本冲突)卡住。
- 运行
composer require php-timer/php-timer前先检查composer.json中的"minimum-stability"和"prefer-stable"设置,避免拉取废弃的 dev 分支 - PHP 7.4+ 用户更稳妥的做法是改用活跃维护的替代品,比如
nikic/php-parser自带的简单计时逻辑,或直接用原生hrtime()(PHP 7.3+) - 若必须用 PHP-Timer(例如老项目迁移受限),需锁定 PHP 版本在 7.1,并在
composer.json中手动添加"php": "^7.1"约束
hrtime() 是 PHP 7.3+ 最轻量精准计时方案
不用装任何包,hrtime() 返回纳秒级时间戳(数组形式),比 microtime(true) 更准、无浮点精度丢失,且开销极低。PHP-Timer 的核心功能它全都能覆盖,还更可靠。
-
hrtime(true)直接返回纳秒整数,适合差值计算:$start = hrtime(true); // your code here $elapsed = hrtime(true) - $start; // 单位:纳秒
- 要转成毫秒或秒,除以对应倍数:
$ms = $elapsed / 1_000_000;,注意用下划线分隔大数字提升可读性 - 别用
hrtime(false)(返回数组),除非你需要跨平台兼容旧版本 PHP;PHP 7.3+ 推荐始终用true参数 - 和
microtime()不同,hrtime()不受系统时钟调整影响(如 NTP 同步),更适合性能压测场景
用 symfony/console + 自定义 Timer 类做可复用计时器
如果项目已用 Symfony 组件,或者需要带标签、嵌套、统计汇总的计时能力,与其硬塞 PHP-Timer,不如写个 20 行的 Timer 类,依赖 hrtime(),再通过 Composer 加载即可。
- 类里用
array存start time和label,stop($label)方法返回毫秒差值 - 避免全局静态状态,每次 new Timer() 实例隔离,防止并发请求互相污染
- 示例关键逻辑:
class Timer { private array $starts = []; public function start(string $label): void { $this->starts[$label] = hrtime(true); } public function stop(string $label): float { return ($this->starts[$label] ?? 0) ? (hrtime(true) - $this->starts[$label]) / 1_000_000 : 0; } } - 把它放在
src/Utils/Timer.php,Composer 自动加载规则配好后,use App\Utils\Timer;就能用
常见错误:把计时器放在 autoload 或中间件里导致误差放大
有人把计时逻辑塞进 Composer 的 autoload 文件,或框架中间件的 handle() 开头/结尾,结果测出来的时间包含 Composer 类加载、OPcache 预热、甚至 DNS 查询——这不是代码执行时间,是环境噪音。
- 只对明确想测的代码块加计时,比如数据库查询前后、算法函数调用前后,而不是整个 HTTP 请求生命周期
- 避免在
__construct()或静态初始化里启动计时器,构造函数本身耗时会被计入,尤其当对象被频繁 new 时 - 如果测的是 Web 请求,记得关掉 Xdebug(
xdebug.mode=off),否则hrtime()测出的“10ms”实际可能有 8ms 来自 Xdebug 开销 - 多次运行取平均值比单次结果可信;用
for ($i = 0; $i 比只跑一次更能暴露真实波动
真正影响精度的往往不是函数选错,而是没意识到计时起点和终点是否干净——hrtime() 再准,包在 autoload 里也白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











