Laravel 10在Hostinger配置queue:work定时任务遇问题求助
Hostinger上Laravel 10定时任务执行queue:work失败排查与修复
问题现状
在Hostinger上配置Laravel 10定时任务,目标是每分钟执行php artisan queue:work --tries=3,但执行schedule:run后返回提示:
INFO No scheduled commands are ready to run.
当前配置:
- 主机定时任务命令:
/usr/bin/php /home/u******/domains/mydomain.com/public_html/artisan schedule:run app/Console/Kernel.php调度代码:protected function schedule(Schedule $schedule): void { // $schedule->command('inspire')->hourly(); $schedule->command('queue:work --tries=3') ->cron('* * * * *') ->withoutOverlapping(); }
核心问题分析
queue:work常驻特性冲突:默认queue:work是常驻进程,首次执行后会持续运行处理队列。withoutOverlapping()检测到已有进程时会跳过后续调度,导致schedule:run提示无任务可执行。- PHP CLI路径可能错误:Hostinger部分环境的PHP命令路径并非
/usr/bin/php,可能是版本特定路径(如/usr/bin/php8.2)或/usr/local/bin/php,路径错误会导致调度器无法启动。 - 任务未被正确识别:若
Kernel.php存在语法错误或Laravel调度器未正确加载,会导致任务不被系统识别。
修复方案
方案一:调整队列命令为一次性执行模式
修改Kernel.php中的调度代码,添加--stop-when-empty参数,让queue:work处理完当前队列后自动退出,避免常驻进程:
protected function schedule(Schedule $schedule): void { $schedule->command('queue:work --tries=3 --stop-when-empty') ->everyMinute() // 等价于cron('* * * * *') ->withoutOverlapping(); }
方案二:修正主机定时任务的PHP路径
- 通过SSH登录服务器,执行以下命令获取正确的PHP CLI路径:
which php - 将主机定时任务命令中的PHP路径替换为上述命令的输出结果,同时添加日志重定向(规避Hostinger限制):
/正确的PHP路径 /home/u******/domains/mydomain.com/public_html/artisan schedule:run >> /dev/null 2>&1
验证步骤
- 进入项目根目录,执行以下命令查看已配置的调度任务,确认任务存在:
php artisan schedule:list - 手动执行调度命令,验证是否正常触发队列任务:
php artisan schedule:run - 查看
storage/logs/laravel.log日志,确认队列任务是否被正确处理。
内容的提问来源于stack exchange,提问作者DevIzee
相关产品推荐
相关产品推荐

