在ThinkPHP6中记录定时任务耗时需三步:execute()内用microtime精准计时;统一写入数据库或日志;用/usr/bin/time命令做系统级验证,结合结构化存储与趋势分析定位真实瓶颈。

在 ThinkPHP6 中记录定时任务每次执行耗时,关键不是“加个 echo”,而是让耗时数据可采集、可存储、可分析。核心动作有三步:脚本内精准计时、统一落库或写日志、结合系统级验证排除干扰。
在命令类 execute() 方法里埋点计时
这是最直接、最可控的方式。ThinkPHP6 的定时任务通常封装为命令行类(如 app\command\CleanCache),所有逻辑都在 execute() 中执行。你只需在开头和结尾插入时间戳计算:
- 开头用
microtime(true)记录起始时间,例如:$start = microtime(true); - 业务逻辑执行完毕后,立即计算差值:
$duration = round((microtime(true) - $start) * 1000, 2); // 单位:毫秒 - 把耗时连同任务名、状态、时间戳一起写入日志或数据库,例如:
Log::info('task:clean_cache', ['duration_ms' => $duration, 'status' => 'success']);
用 Crontab + time 命令做外部验证
仅靠 PHP 内部计时可能掩盖启动开销(如框架加载、自动加载器初始化)。建议在服务器层用 time 命令包裹实际调用,获取真实进程耗时:
- Crontab 规则示例:
* * * * * /usr/bin/time -o /var/log/think-cron-time.log -a php /var/www/myproject/think cron:clean-cache 2>&1 - 输出格式含
real(总耗时)、user(CPU 用户态)、sys(CPU 内核态),重点关注real值 - 若发现
real明显大于 PHP 内计时,说明瓶颈在初始化阶段,需优化 autoloader 或启用 OPCache
结构化留存并支持趋势分析
单次耗时没意义,持续记录才能发现问题。推荐建一张轻量监控表(如 task_execution_log):
立即学习“PHP免费学习笔记(深入)”;
- 字段至少包含:
task_name(如 cron:clean-cache)、exec_time(datetime)、duration_ms(整型)、status(enum: success/failed)、error_msg(text,失败时记录) - 在 execute() 结尾处用 Db 类或模型写入,避免日志轮转丢失历史
- 配合 Grafana 或简易后台页面,绘制「近7天平均耗时」「P95 耗时」「失败率」曲线,对连续超阈值(如 >5s)的任务自动告警
注意区分真实瓶颈与假性延迟
耗时长不等于代码慢,要结合上下文判断:
- PHP 内计时短但
time的real很长 → 启动慢,检查是否每次 reload 全量框架、是否启用了调试模式 - 耗时波动剧烈 → 检查外部依赖:数据库慢查询、HTTP API 超时、Redis 连接阻塞
- 内存持续上涨伴随耗时增长 → 查是否有未 unset 的大数组、循环引用、或日志写入未限流



















