Laravel任务调度通过app/Console/Kernel.php中的schedule方法定义任务,支持Artisan命令、闭包、系统命令和队列任务,结合Crontab每分钟运行schedule:run来触发,可设置daily、hourly等频率及复杂规则如weeklyOn、withoutOverlapping,并可通过日志、onOneServer、ping监控等方式调试和优化。

Laravel 任务调度,简单来说,就是让你像设置闹钟一样,定时执行一些 PHP 代码。至于调度命令,那得看你想怎么个“定时”法了。
使用 Laravel 的任务调度器,你可以将原本需要在服务器上手动运行的脚本,或者需要通过 Crontab 设置的定时任务,统一管理起来,方便维护和查看。
解决方案
Laravel 的任务调度核心在于
app/Console/Kernel.php
schedule
基本步骤:
定义任务: 首先,你需要确定你要执行什么任务。这可以是一个 Artisan 命令,也可以是一个闭包函数,甚至是一个操作系统命令。
注册任务: 在
schedule
$schedule
配置 Crontab: 最后,你需要配置服务器的 Crontab,让 Laravel 的调度器能够定期运行。
举个例子:
假设你要每天凌晨 1 点执行一个名为
backup:database
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:database')
->dailyAt('01:00');
}这行代码的意思是,每天凌晨 1 点,执行
php artisan backup:database
常用的调度方法:
daily()
hourly()
weekly()
monthly()
cron($expression)
cron('0 0 * * *')everyMinute()
别忘了在服务器上配置 Crontab,添加以下条目:
* * * * * php /path/to/your/project/artisan schedule:run >> /dev/null 2>&1
这个 Crontab 条目表示每分钟运行一次
php artisan schedule:run
副标题1
Laravel 任务调度支持哪些复杂的调度规则?
除了常见的
daily
hourly
指定星期/日期: 你可以使用
weeklyOn()
monthlyOn()
$schedule->command('emails:send')
->weeklyOn(1, '13:00'); // 每周一 13:00 执行执行环境判断: 你可以使用
environments()
$schedule->command('emails:send')
->daily()
->environments('production');防止任务重叠: 如果你的任务执行时间比较长,可以使用
withoutOverlapping()
$schedule->command('emails:send')
->daily()
->withoutOverlapping();还可以指定锁的过期时间:
$schedule->command('emails:send')
->daily()
->withoutOverlapping(3600); // 锁 3600 秒维护模式下的执行: 你可以使用
evenInMaintenanceMode()
$schedule->command('emails:send')
->daily()
->evenInMaintenanceMode();副标题2
如何调试 Laravel 任务调度?如果任务没有按时执行怎么办?
调试任务调度,是个让人头疼的问题。首先,检查你的 Crontab 是否配置正确。你可以尝试手动运行
php artisan schedule:run
如果任务没有按时执行,可以尝试以下方法:
检查日志: Laravel 默认会将调度任务的输出写入日志文件。检查
storage/logs/laravel.log
sendOutputTo()
$schedule->command('emails:send')
->daily()
->sendOutputTo('/path/to/output.log');使用 thenPing()
thenPing()
$schedule->command('emails:send')
->daily()
->thenPing('https://example.com/ping');检查服务器时区: 确保服务器的时区设置正确。Laravel 默认使用
config/app.php
timezone
检查任务是否被禁用: 你可以使用
when()
$schedule->command('emails:send')
->daily()
->when(function () {
return true; // 总是执行
});使用 onOneServer()
onOneServer()
$schedule->command('emails:send')
->daily()
->onOneServer();副标题3
除了 Artisan 命令,Laravel 任务调度还能执行哪些类型的任务?
除了 Artisan 命令,Laravel 任务调度还可以执行以下类型的任务:
闭包函数: 你可以直接在
schedule
$schedule->call(function () {
DB::table('users')->delete();
})->daily();操作系统命令: 你可以使用
exec()
$schedule->exec('node /path/to/script.js')
->daily();注意:执行操作系统命令需要谨慎,确保命令的安全性。
队列任务: 你可以使用
job()
$schedule->job(new ProcessPodcast)->daily();
调用外部 URL: 你可以使用
pingBefore()
thenPing()
$schedule->command('emails:send')
->daily()
->pingBefore('https://example.com/ping-before')
->thenPing('https://example.com/ping-after');以上就是Laravel任务调度?调度命令怎样设置?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号