跳转到主内容
极星编程网:以代码为星,赴技术山海!

Laravel怎么设置定时任务_Laravel Task Scheduling教程【自动】

Laravel定时任务需外部每分钟调用php artisan schedule:run,Linux服务器必须配置Cron;本地调试可用schedule:work;常见失败原因包括工作目录错误、PHP路径不明确、权限不足及锁机制失效。 定时任务没跑起来?先确认
schedule:run
是否被正确调用 Laravel 的定时任务本身不自动触发,它只提供一个调度定义接口,真正执行靠的是外部每分钟调用一次的
php artisan schedule:run
。如果你发现
$schedule->command('inspire')->hourly()
写了但没反应,大概率是服务器没配 Cron。 Linux 服务器必须加一行 Cron:
* * * * * cd /var/www/your-app && php artisan schedule:run >> /dev/null 2>&1
本地开发用
php artisan schedule:work
可以常驻监听(Laravel 6+),但它不替代生产环境的 Cron,仅用于调试 别在 Homestead/Valet 等环境里依赖系统 Cron 自动启用——有些默认没开,得手动
sudo service cron start
schedule:run
执行失败但没报错?检查命令权限和路径 常见现象是 Cron 日志里出现
Could not open input file: artisan
或直接静默退出。根本原因通常是工作目录不对或 PHP CLI 版本不一致。 Cron 默认工作目录是 root 用户家目录,不是项目根目录,所以必须显式
cd
进入项目路径 用绝对路径调用 PHP:比如
/usr/bin/php
而非
php
,避免 Cron 使用系统自带旧版 PHP(尤其 Ubuntu) 如果任务里调用了 shell 命令(如
exec('git pull')
),确保运行 Cron 的用户有对应权限,且环境变量(如
$PATH
)已预设 任务卡住、重复执行、或时间不准?看清楚
withoutOverlapping()
和
runInBackground()
的作用边界 定时任务不是“到了点就立刻执行”,而是每分钟由
schedule:run
检查一次是否该跑。如果上一个实例还没结束,新实例就会被跳过——除非你主动干预。 Laravel 13.2.0 PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。 下载
withoutOverlapping()
是靠在 storage/framework/cache/ 下写锁文件实现的,不是数据库锁;如果应用部署在多台机器,这个锁会失效
runInBackground()
让命令异步执行,但不解决超时问题;若子进程崩溃或被 kill,主进程不会感知,锁文件可能残留,导致后续任务永久被跳过 长时间任务(如导出大 Excel)建议配合
onOneServer()
+ Redis 驱动的锁,而不是只靠
withoutOverlapping()
测试定时任务逻辑时,别直接等明天 开发阶段验证
$schedule->command('backup:db')->dailyAt('02:00')
是否真能跑通,没必要等到凌晨两点。 临时改成
everyMinute()
或
twiceDaily(1, 2)
快速验证逻辑 用
php artisan schedule:test --event="backup:db"
(需 Laravel 9.25+)可模拟触发,绕过时间判断 注意:测试时不要删掉正式环境的 Cron,否则上线后容易忘记补回 事情说清了就结束。最常被忽略的其实是 Cron 的用户权限和工作目录——不是代码写错了,是它根本没进到你的项目里。

相关文章