yii3定时任务不再依赖外部cron,而是通过官方扩展yiisoft/yii-console-scheduler实现原生调度,支持声明式定义、自动触发、防重执行及异步集成。

Yii2.0 的定时任务本质是借力操作系统调度器(如 Linux cron 或 Windows 任务计划程序)来执行控制台命令,框架本身不内置任务调度器。而 Yii3 已正式发布(2023 年底 GA),其定时任务机制发生了实质性演进——引入了原生支持的异步任务与可插拔的调度扩展,不再强依赖外部 cron。
下面分两部分说明:
Yii2.0 定时任务怎么写
核心是两步:写一个控制台控制器 + 用 crontab(或 Windows 计划任务)调用它。
-
在
console/controllers/下新建控制器,继承yii\console\Controller<?php namespace console\controllers; use yii\console\Controller; class ReportController extends Controller { public function actionDailySummary() { echo "生成昨日报表...\n"; // 你的业务逻辑,可直接使用 Yii::$app、ActiveRecord、组件等 return self::EXIT_CODE_NORMAL; } } -
命令行测试是否可用
php yii report/daily-summary
-
配置系统级定时任务(Linux 示例)
运行crontab -e,添加一行:0 2 * * * /usr/bin/php /var/www/myapp/yii report/daily-summary >> /var/log/yii-cron.log 2>&1
⚠️ 注意:
- 必须用 PHP 和 yii 的绝对路径(
which php查找) - 推荐重定向输出到日志,便于排查
- 确保运行用户(如
www-data或nginx)对runtime/和日志目录有读写权限 - 如任务耗时长或可能并发重叠,需加锁(例如用
flock或 Redis 锁)
- 必须用 PHP 和 yii 的绝对路径(
Yii3 的定时任务新方式
Yii3 不再只靠“外部调用控制台命令”,而是提供更现代、集成度更高的方案:
-
✅ 官方扩展
yiisoft/yii-console-scheduler
这是 Yii3 推荐的定时任务解决方案,支持:- 在 PHP 进程内声明式定义周期任务(类似 Laravel Scheduler)
- 自动通过
yii schedule/run命令触发(仍需一个基础 cron 触发该命令,但频率可固定为每分钟一次) - 支持闭包、类方法、命令字符串等多种可调用形式
- 内置防止重复执行、失败重试、日志记录等能力
示例(在
config/console.php中注册):use Yiisoft\Yii\Console\Scheduler\Schedule; return [ 'bootstrap' => [Schedule::class], 'services' => [ Schedule::class => [ '__construct()' => [ 'schedule' => static function (Schedule $schedule): void { $schedule->command('report/daily-summary')->dailyAt('02:00'); $schedule->command('cache/clear')->hourly(); }, ], ], ], ];然后只需设置一条轻量级系统 cron:
* * * * * cd /var/www/myapp && /usr/bin/php yii schedule/run >> /dev/null 2>&1
✅ 异步任务支持(配合
yiisoft/queue)
Yii3 将队列与定时深度整合:可延迟投递任务($queue->delay(3600)->push(...)),也支持 cron 触发后推入队列异步执行,提升响应性与可靠性。✅ 类型安全 + DI 原生支持
控制台命令自动注入依赖(如MailerInterface、LoggerInterface),无需手动Yii::$app->get(),代码更清晰、易测。
对比小结
| 维度 | Yii2.0 | Yii3 |
|---|---|---|
| 调度主体 | 完全依赖系统 cron | 内置调度器(需每分钟调一次基础命令) |
| 任务定义位置 | 分散在控制器 action 中 | 集中在配置或专用调度器回调中 |
| 并发控制 | 需自行实现(flock/Redis) | 调度器默认支持 withoutOverlapping()
|
| 扩展性 | 无标准扩展机制,靠自研或第三方包 | 官方扩展生态完善,支持插件化调度策略 |
| 开发体验 | 略显底层,路径/权限易出错 | 类型安全、IDE 友好、调试日志更结构化 |
Yii3 的方式显著降低了运维复杂度,也更贴近现代 PHP 应用的开发范式。如果你的新项目选型允许,建议直接采用 Yii3 + yii-console-scheduler。











