Yii框架定时任务依赖操作系统cron调度控制台命令,需创建继承yii\console\Controller的命令类并配置crontab绝对路径,同时重定向日志、防并发、保障runtime权限。

Yii 框架本身不内置批量任务调度器,但提供了清晰、可扩展的机制来支撑批量业务处理——关键在于分层解耦 + 合适工具选型 + 运行时控制。实际开发中,不能只靠一个“for循环跑完所有数据”,而要结合场景选择控制台命令、消息队列或进程管理,并做好错误隔离、进度跟踪和资源约束。
用 Console Command 做基础批量入口
所有批量逻辑起点应是 console/controllers/ 下的控制器,继承 yii\console\Controller。它天然支持参数接收、退出码返回、交互提示,适合定时触发的离线任务。
- 定义带参数的动作,比如清理过期日志:
php yii log/clean --days=30 - 在 action 中分批查询(避免单次加载全量数据),用
createCommand()->batchInsert()或ActiveRecord::updateAll()提升写入效率 - 每处理 N 条记录调用
$this->stdout(".");输出进度点,便于观察执行状态 - 捕获异常后记录日志并
return self::EXIT_CODE_ERROR,方便 crontab 判断失败
用 yii2-queue 实现异步+可靠批量
当批量操作涉及耗时 I/O(如调用第三方接口、生成 PDF、发邮件)或需防页面阻塞时,必须引入消息队列。yii2-queue 是 Yii 官方推荐方案,支持 DB、Redis、RabbitMQ 等驱动。
- 任务类实现
JobInterface,把单条记录处理逻辑封装进execute()方法,确保幂等 - 批量推送时用
Yii::$app->queue->bulkPush($jobs)(v2.3.4+ 支持),比循环 push 更高效 - 配置 Redis 驱动可启用延迟任务(
push(new Job(), 60)表示 60 秒后执行),适合错峰处理 - 配合
yii\queue\RetryableJobInterface可自动重试失败任务,避免单点失败中断整批
用多进程或协程提升吞吐(慎用)
纯 CPU 密集型或高 IO 并发批量(如解析数百个 XML、并发调用多个海关接口),可考虑子进程分片。Yii 本身不封装进程管理,需手动集成。
- 主进程预分配任务数组,按数量均分给 N 个子进程(避免文件/记录重复处理)
- 用
pcntl_fork()创建子进程,每个子进程独立连接数据库、初始化 Yii 应用实例(注意关闭自动重连) - 子进程完成时写入临时状态文件或 Redis 标记,主进程轮询等待全部结束
- 更现代的做法是改用 Swoole 协程 +
go()并发执行,但需确保所用组件(如数据库连接池)支持协程
监控与容错不能少
批量任务一旦上线,没人盯着就容易出问题。必须内置可观测能力:
- 每次运行生成唯一 batch_id,所有日志、数据库变更、队列任务都带上该标识,便于追踪
- 在 runtime 目录下写
batch_{batch_id}.status文件,内容含 start_time、processed、failed、ended - 对关键步骤加数据库事务或 Redis 锁(如“正在处理订单号 XXX”),防止 crontab 重叠触发
- 任务完成后自动触发通知(邮件/Webhook),失败时附带前 3 条错误详情和日志路径


















