Laravel定时任务缓存异常:手动执行正常,调度执行旧版本代码
解决Laravel调度器执行旧版本命令的问题
这种情况我之前排查过好几次,大概率是执行环境不一致或者缓存没清理彻底导致的,给你几个针对性的排查和解决步骤:
1. 清理Laravel调度器专属缓存
你提到已经清了各类缓存,但可能漏掉了调度器的专属缓存。Laravel会缓存调度任务的配置,执行这个命令彻底清除:
php artisan schedule:clear
执行完之后可以再手动触发一次调度器测试:
php artisan schedule:run
2. 检查调度器的执行路径与环境
手动执行正常但自动执行异常,最常见的原因是执行环境不一致:
- 给调度任务添加日志输出,方便排查执行时的错误或路径问题:
等待调度自动执行后,查看日志文件,确认是否有路径错误、权限问题或者加载了旧文件的提示。protected function schedule(Schedule $schedule){ $schedule->command('ticket:completion') ->hourly() ->appendOutputTo(storage_path('logs/ticket_completion.log')); } - 尝试在调度中使用绝对路径执行命令,避免环境变量差异:
protected function schedule(Schedule $schedule){ // 替换成你服务器上的PHP绝对路径和项目绝对路径 $schedule->exec('/usr/local/bin/php /var/www/your-project/artisan ticket:completion') ->hourly(); }
3. 确认Supervisor进程已重启
如果你用Supervisor管理Laravel调度器的常驻进程:
- 先重启对应的Supervisor进程,确保它加载了最新的代码和配置:
supervisorctl restart your-schedule-worker-name - 检查Supervisor配置文件中的命令,确保使用了项目的绝对路径,比如:
command=/usr/local/bin/php /var/www/your-project/artisan schedule:run
4. 检查系统Crontab配置
如果是用系统Crontab触发调度器:
- 打开Crontab配置(
crontab -e),确认条目是这样的(必须先切换到项目目录):* * * * * cd /var/www/your-project && php artisan schedule:run >> /dev/null 2>&1 - 确认Crontab的执行用户和你手动执行命令的用户一致,避免权限或环境变量差异。
5. 清除所有Laravel优化缓存
如果之前执行过php artisan optimize或php artisan config:cache,可能导致命令类被缓存:
php artisan optimize:clear
这个命令会一次性清除配置缓存、路由缓存、视图缓存、调度缓存等所有优化缓存。
内容的提问来源于stack exchange,提问作者Mateus Alberghini
相关产品推荐
相关产品推荐

