laravel 10的调度器不直接控制维护模式,但可在定时任务中调用artisan::call('down')或up命令实现计划性开关;需注意权限、多机同步及容错设计,推荐ci/cd主导+scheduler兜底。

Laravel 10 的任务调度(Scheduler)和维护模式(Maintenance Mode)是两个独立机制,调度器本身不直接设置或控制维护模式。但你可以在定时任务中主动调用 Artisan 命令来开启或关闭维护模式,实现“按计划进入/退出维护状态”,比如部署前自动启用、部署后自动恢复。
✅ 在 Scheduler 中触发维护模式开关
在 app/Console/Kernel.php 的 schedule() 方法里,可通过 Artisan::call() 执行 down 或 up 命令:
use Illuminate\Support\Facades\Artisan;
protected function schedule(Schedule $schedule)
{
// 每天凌晨 1:30 开启维护模式(例如为凌晨部署准备)
$schedule->call(function () {
Artisan::call('down', [
'--message' => '系统即将更新,请稍候',
'--retry' => 300,
'--allow' => '192.168.1.100',
]);
})->dailyAt('01:30');
// 每天凌晨 2:15 关闭维护模式(部署完成后恢复)
$schedule->call(function () {
Artisan::call('up');
})->dailyAt('02:15');
}
⚠️ 注意:
-
Artisan::call()是同步执行的,会实际写入storage/framework/down文件或删除它; - 确保运行
schedule:run的系统用户对storage/目录有读写权限; - 若多服务器部署,需确保所有节点都执行相同逻辑(建议配合配置中心或外部协调机制)。
✅ 配合部署流程更可靠的做法
单纯靠 Scheduler 自动开关存在风险(如任务失败、服务器时间不同步、schedule:run 未正常触发等)。推荐组合使用:
-
CI/CD 流程中调用
php artisan down→ 部署 →php artisan up(最稳妥); - Scheduler 仅作兜底或提醒:例如检测到
storage/framework/down存在超 2 小时,自动发告警或尝试up; - 后台管理页提供「手动切换」按钮,并用
app()->isDownForMaintenance()实时判断状态。
✅ 判断当前是否处于维护模式(用于调度逻辑分支)
你也可以在任务中做条件判断,避免维护期间执行敏感操作:
$schedule->call(function () {
if (! app()->isDownForMaintenance()) {
// 只在非维护状态下执行清理任务
\App\Models\Log::cleanOldEntries();
}
})->daily();
这样可防止维护期间误触发队列、通知、同步等行为。
❌ 不要这样做
- ❌ 不要在
down命令中依赖调度器本身(schedule:run在维护模式下仍可运行,但应用路由已不可达,而 Artisan 命令不受影响——这点常被误解); - ❌ 不要手动读写
storage/framework/down文件,该格式属于 Laravel 内部实现,未来版本可能变更; - ❌ 不要将
php artisan down写进 shell 脚本再由$schedule->exec()调用(权限、路径、环境变量易出错,不如Artisan::call()稳定)。
维护模式本质是请求拦截机制,调度器是后台任务引擎,二者职责分明。合理组合,才能既保障升级安全,又不失自动化能力。











