yii2高级版的console任务需手动创建控制器,满足四条件:放@console/controllers下、命名空间consolecontrollers、继承yiiconsolecontroller、含action开头的public方法;运行用php yii controller/action,定时需crontab等系统工具。

安装 Yii2 高级版后,控制台(console)任务不是开箱即用的“自动运行”功能,而是需要手动创建控制器、确保路径与继承正确、再通过 php yii 命令显式调用。它本身不内置调度器,需配合系统级定时工具(如 crontab)才能实现周期性执行。
自定义 console 控制器怎么写
必须满足四个硬性条件,缺一不可:
- 文件放在
@console/controllers/目录下(例如console/controllers/SendReportController.php) - 类命名严格匹配文件名,且使用命名空间
consolecontrollers - 必须继承
yiiconsoleController(不能是yiiwebController) - 至少定义一个以
action开头的public方法,比如actionSend()
示例:
namespace consolecontrollers;
use yiiconsoleController;
class SendReportController extends Controller
{
public function actionSend($date = null)
{
echo "Sending report for {$date ?: date('Y-m-d')}\n";
return 0;
}
}
怎么运行和测试你的 console 命令
在项目根目录下执行:php yii send-report/sendphp yii send-report/send --date=2026-06-02
注意命令格式:
– 第一段是控制器名(小写+中划线,自动映射到 SendReportController)
– 第二段是 action 名(小写+中划线,对应 actionSend)
– 参数可作位置参数(如 send-report/send 2026-06-02)或带 --key=value 的选项(需在类中声明 $options 或 options() 方法)
如何让 console 任务定时自动执行
Yii2 不提供内置任务调度服务,必须借助操作系统级定时机制:
- Linux 下编辑当前用户的 crontab:
crontab -e - 添加一行(以每小时执行一次报告为例):
0 * * * * /usr/bin/php /var/www/myapp/yii send-report/send >> /var/www/myapp/runtime/logs/report-cron.log 2>&1 - 关键细节:
– 显式指定 PHP 解释器路径(避免环境变量差异)
– 使用绝对路径写全yii脚本位置
– 重定向日志便于排查失败(>>追加标准输出,2>&1合并错误输出)
常见报错及快速排查点
遇到 Unknown command 或 Class not found,优先检查:
- 控制器类是否真的继承
yiiconsoleController(不是 web 版) - 文件路径是否为
console/controllers/XxxController.php,命名空间是否为consolecontrollers - 类名是否为
XxxController,且首字母大写、结尾带Controller - console 应用配置(
console/config/main.php)未覆盖默认controllerMap导致扫描失效(一般不用动,默认已启用自动发现) - 命令行执行时是否在项目根目录,且
yii文件存在并有可执行权限











