Yii框架定时任务需通过Console控制器(继承yii\console\Controller)配合服务器crontab或Windows任务计划触发;不配置crontab则仅为手动命令,无法自动执行。

Yii 框架的定时任务不是框架“自带调度器”跑出来的,而是靠你写好 Console 控制器 + 服务器 crontab(或 Windows 任务计划)配合触发。不配 crontab,php yii xxx 就只是手动命令,不会自动执行。
Console 控制器必须继承 yii\console\Controller
这是最常踩的坑:用 yii\web\Controller 写控制台命令,运行时直接报 Unknown command 或 Class not found。Yii 的 console 和 web 是两套完全隔离的应用启动流程,类加载、命令发现机制都不一样。
- 控制器文件必须放在
@console/controllers/目录下(比如console/controllers/CronController.php) - 类名必须匹配文件名,且命名空间为
console\controllers - 至少定义一个以
action开头的 public 方法,如actionRun(),它才会被识别为可执行命令 - 方法内不要依赖
Yii::$app->request这类 Web 组件,它们在 console 环境里不存在
命令行参数和选项怎么传给 action 方法
Yii2 控制台支持两种传参方式:位置参数(按顺序)和命名选项(--key=value),但必须显式声明在方法签名里,否则会被忽略。
- 位置参数直接作为方法参数接收,例如
public function actionSend($limit = 10)→ 执行php yii cron/send 5时$limit就是5 - 选项需加
--前缀,且方法参数名要和选项名一致(下划线转短横线),例如public function actionSend($limit = 10, $force = false)→ 可用--force=1或--force传入 - 没声明的参数不会自动注入,
$this->args是已解析后的原始数组,一般不用手动读取 - 如果想交互式输入,可用
$this->prompt()或$this->confirm(),适合运维手动触发场景
crontab 配置里最容易错的三处路径
Linux 上加 crontab 不是写对命令就完事,PATH、PHP 路径、应用根路径这三项错一个,任务就静默失败,连错误日志都看不到。
-
/usr/bin/php必须是真实 PHP 解释器路径,用which php确认;虚拟环境或宝塔用户尤其要注意,可能得写成/www/server/php/82/bin/php -
/path/to/yii必须是项目根目录下的yii入口脚本(非console.php,那是 Yii1 的写法),且该文件要有可执行权限(chmod +x yii) - 重定向建议保留:
> /dev/null 2>&1,否则 cron 默认发邮件,而多数服务器没配本地 mail 服务,会导致任务卡住或报错 - 测试命令是否能跑通,先切到 root 用户或对应系统用户下,手动执行一遍完整命令,再加进 crontab
真正麻烦的从来不是写个 actionRun(),而是让 crontab 在凌晨三点准时调起它,且数据库连接、日志路径、临时文件权限全都没问题——这些细节不验证,任务就只是“看起来配置好了”。


















