如何通过命令行禁用PHP/Laravel项目单个定时任务且无需修改代码
解决方案
Laravel 原生没有提供命令行直接禁用单个调度任务的功能,你可以根据自己的场景选择以下两种实现方案,都不需要为了临时禁用单独发版:
方案1:长期可复用的开关方案(仅需1次发版,后续所有任务调整都不用改代码)
首次修改app/Console/Kernel.php中的任务注册代码,给需要支持开关的任务加上when()条件,读取.env 配置项判断是否执行:
// 原代码 $schedule->command('invoices:somejob')->cron('0 1 5 * *'); // 修改后代码 $schedule->command('invoices:somejob') ->cron('0 1 5 * *') // 没有配置时默认开启,不影响原有逻辑 ->when(env('SCHEDULE_INVOICES_SOMEJOB_ENABLED', true));
这次修改上线后,后续要禁用该任务只需要在服务器的.env文件中添加一行:
SCHEDULE_INVOICES_SOMEJOB_ENABLED=false
再执行php artisan config:clear清空配置缓存即可生效,恢复时只需把配置值改为true再清缓存即可,不需要修改任何业务代码。
方案2:完全不需要修改原有项目代码的临时方案
如果不想做任何代码改动上线,可选以下两种操作:
- 如果你的任务是直接单独配置在服务器crontab中,没有用Laravel统一的
schedule:run入口:直接执行crontab -e编辑定时任务列表,注释掉invoices:somejob对应的那行配置即可,恢复时取消注释就行。 - 如果用了Laravel统一调度入口:在
app/Console/Commands目录下新建一个和要禁用的任务签名完全一致的命令类:
Laravel会优先加载你新写的命令,原有任务逻辑不会执行,恢复时直接删除这个新建的命令文件即可。<?php namespace App\Console\Commands; use Illuminate\Console\Command; class DisableInvoicesSomejob extends Command { protected $signature = 'invoices:somejob'; protected $description = '临时禁用任务'; public function handle() { return 0; } }
内容的提问来源于stack exchange,提问作者AidenFry
相关产品推荐
相关产品推荐

