如何查看Laravel调度命令的上次执行时间?最优方案咨询
Laravel调度任务上次执行时间的最优实现方案
核心思路:追踪任务本身的执行状态,而非每条记录
你不需要更新40条服务记录的时间,只需要单独追踪调度任务本身的上次执行时间,这样既轻量又能准确判断任务是否正常运行。
方案1:创建极简单记录表(最推荐)
这是平衡可靠性和性能的最优解,完全规避缓存清空风险,性能开销可以忽略。
- 建表:只需要一个简单的表,比如
task_executions,字段包括task_name(任务唯一标识,比如service_ping_checker)、last_executed_at(时间戳)。 - 实现:在你的ping任务的
handle()方法开头,执行一行极简更新语句:DB::table('task_executions') ->updateOrInsert( ['task_name' => 'service_ping_checker'], ['last_executed_at' => now()] ); - 查看:直接查询该表的
last_executed_at值,对比当前时间就能判断任务是否按时运行(比如30秒调度的话,超过1分钟没更新就说明异常)。 - 优势:数据持久化不会丢失;单条SQL操作,极低性能开销,和你检查40个服务的操作完全不冲突。
方案2:利用Laravel日志(适合快速排查,不适合长期监控)
如果不想新增数据库表,可以在任务开头写入一条极简日志:
Log::info('Service ping checker executed at: ' . now()->toIso8601String());
- 查看:直接在
storage/logs/laravel.log里搜关键词Service ping checker executed,找到最新的时间戳即可。 - 注意:如果开启了日志按天分割,要对应到当天的日志文件;单条日志写入的IO开销可以忽略,不会影响30秒一次的调度频率。
方案3:缓存存储(适合临时验证,不推荐长期依赖)
用缓存存储执行时间,比如Redis或文件缓存:
Cache::put('service_ping_checker_last_executed', now()->timestamp, 86400); // 缓存1天
- 查看:通过
Cache::get('service_ping_checker_last_executed')获取时间戳,转成日期后对比当前时间。 - 劣势:缓存清空(比如重启缓存服务、缓存过期)会丢失记录,无法追溯历史执行情况,只适合临时验证任务是否在运行。
额外优化:任务执行结果追踪(可选)
如果需要更细致的监控,可以在task_executions表新增status(成功/失败)、execution_duration(执行耗时)字段,这样不仅能确认任务是否运行,还能知道任务执行是否成功、耗时多少。
示例更新逻辑:
$startTime = microtime(true); // 你的ping服务检查逻辑... $isSuccess = true; // 根据实际检查结果赋值 $duration = round(microtime(true) - $startTime, 2); DB::table('task_executions') ->updateOrInsert( ['task_name' => 'service_ping_checker'], [ 'last_executed_at' => now(), 'status' => $isSuccess ? 'success' : 'failed', 'execution_duration' => $duration ] );
内容的提问来源于stack exchange,提问作者clover
相关产品推荐
相关产品推荐

