laravel任务调度提供before、after、onsuccess、onfailure、pingbefore、pingafter六种钩子,用于增强可观测性与可靠性;执行顺序为before→pingbefore→命令执行→onsuccess/onfailure→after→pingafter,且均在相同环境运行。

Laravel任务调度的任务钩子(Task Hooks)用于在任务执行前、执行后、成功或失败时插入自定义逻辑,比如记录日志、发送通知、清理资源或触发监控回调。它们不改变任务本身,而是增强可观测性与可靠性。
支持的钩子类型及用法
Laravel 提供了 before、after、onSuccess、onFailure、pingBefore 和 pingAfter 六种钩子,全部以链式方法调用:
- before():任务开始执行前触发,适合初始化、加锁或预检查
- after():无论成功失败都会执行,适合统一收尾(如释放资源)
- onSuccess():仅当命令退出码为 0 时执行,适合发成功通知
- onFailure():仅当命令非零退出时执行,适合告警或重试补偿
- pingBefore():任务启动前向指定 URL 发送 HTTP GET 请求(常用于 UptimeRobot 或 Healthchecks.io)
-
pingAfter():任务结束后发送成功 ping;若失败则默认不发,可配合
onFailure手动补发
实际配置示例
在 app/Console/Kernel.php 的 schedule() 方法中添加钩子:
$schedule->command('emails:send')
->daily()
->before(function () {
\Log::info('邮件发送任务即将启动');
})
->after(function () {
\Log::info('邮件发送任务已结束');
})
->onSuccess(function () {
\Mail::to('admin@example.com')->send(new TaskSucceeded());
})
->onFailure(function () {
\Notification::route('slack', 'https://hooks.slack.com/...')->notify(new TaskFailed());
})
->pingBefore('https://healthchecks.io/ping/abc123/')
->pingAfter('https://healthchecks.io/ping/abc123/');
注意事项与技巧
- 钩子函数内不可阻塞主线程,避免耗时操作(如同步 HTTP 请求),建议改用队列异步处理
-
onFailure不会自动重试任务,需自行调用Artisan::queue()或结合tries配置 - 多个钩子可叠加使用,执行顺序固定为:
before → pingBefore → 命令执行 → onSuccess/onFailure → after → pingAfter - 闭包钩子中无法直接访问命令参数,如需上下文,建议封装为独立命令类并在其
handle()中处理钩子逻辑
配合日志与调试
钩子输出可通过 sendOutputTo() 和 appendOutputTo() 一并写入日志文件,便于关联追踪:
$schedule->command('backup:run')
->dailyAt('02:00')
->sendOutputTo(storage_path('logs/backup.log'))
->onFailure(function () {
\Log::error('数据库备份失败,请立即检查磁盘空间');
});
不复杂但容易忽略的是钩子执行环境与主命令一致——它运行在相同进程、相同用户权限下,也受相同 PHP 配置和 Laravel 环境限制(如 APP_ENV=local 时部分钩子可能被跳过)。











