如何在OctoberCMS中创建定时命令更新过期认证的状态字段
现有代码优化
你当前写的命令逻辑基本可用,但可以做两处优化提升性能和正确性:
- 原代码里的
->被转义为HTML字符是编写时的格式问题,实际运行要改成正常的对象调用符 - 不需要查询所有认证记录再逐一遍历更新,可以直接用查询构造器过滤已过期的记录批量更新,减少数据库IO
优化后的完整代码如下:
<?php namespace Bitpixlimited\Concert\Console; use Illuminate\Console\Command; use BitpixLimited\ConCert\Models\Certification; /** * CheckExpiredCertifications Command */ class CheckExpiredCertifications extends Command { /** * @var string name is the console command name */ protected $name = 'concert:checkexpiredcertifications'; /** * @var string description is the console command description */ protected $description = '检查已过期的认证记录并更新状态'; /** * handle executes the console command */ public function handle() { // 直接过滤过期的记录批量更新,性能更高 $updatedCount = Certification::where('expiry_date', '<', now()) ->where('status', 0) // 只更新还没标记为过期的记录,避免重复操作 ->update(['status' => 1]); $this->info("已成功更新{$updatedCount}条过期认证记录的状态"); } /** * getArguments get the console command arguments */ protected function getArguments() { return []; } /** * getOptions get the console command options */ protected function getOptions() { return []; } }
命令注册
写好命令类后需要在你的插件的Plugin.php文件中注册命令,才能被OctoberCMS识别:
- 打开
plugins/bitpixlimited/concert/Plugin.php - 在
register方法中添加命令注册逻辑,示例如下:
public function register() { $this->registerConsoleCommand('concert.checkexpiredcertifications', \Bitpixlimited\Concert\Console\CheckExpiredCertifications::class); }
- 注册完成后可以在项目根目录执行
php artisan list,如果能找到concert:checkexpiredcertifications命令说明注册成功,可手动执行php artisan concert:checkexpiredcertifications测试功能是否正常。
调度配置
要让命令定时自动执行,需要配置OctoberCMS的调度任务:
- 同样在插件的
Plugin.php文件中添加registerSchedule方法:
public function registerSchedule($schedule) { // 每天凌晨1点执行一次检查,你可以根据需求调整执行频率 $schedule->command('concert:checkexpiredcertifications')->dailyAt('01:00'); }
- 最后要确保系统的Crontab已经配置了OctoberCMS的调度入口,在服务器上执行
crontab -e添加如下规则(替换为你项目的实际根目录路径):
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
这个Crontab会每分钟检查一次有没有需要执行的调度任务,触发你配置的定时命令。
内容的提问来源于stack exchange,提问作者Jakef19
相关产品推荐
相关产品推荐

