ThinkPHP命令行工具开发需确保三件事:类继承think\console\Command、命名空间为app\command且类名文件名一致;config/console.php保持空数组启用自动发现或手动注册;参数选项须在configure()中声明后通过$input->getArgument()/hasOption()获取。

ThinkPHP 命令行工具自定义开发不难,但细节错一点就“看不见命令”或“一跑就报错”。核心就三件事:类写对、注册准、执行稳——90% 的问题都卡在这三个环节。
类文件怎么写才被识别
必须继承 think\console\Command(不是 think\command\Command,那是旧版路径),命名空间为 app\command,类名与文件名严格一致(如 SyncUser.php 里定义 class SyncUser)。
- configure() 方法里必须调用
$this->setName('user:sync'),命令名只允许小写字母、数字、冒号和中划线 - execute() 是唯一执行入口,参数签名必须是
execute(Input $input, Output $output) - 别写 handle() 方法,TP6+ 不识别;也别漏掉 use 语句:
use think\console\Input;和use think\console\Output;
命令怎么注册才生效
TP6/8 默认启用自动发现(扫描 app/command/ 下的类),但一旦你改过 config/console.php 或手动注册,就必须显式声明。
- 推荐方式:保持
config/console.php返回空数组return [];,靠自动发现 - 手动注册方式:在
config/console.php的commands数组中添加app\command\SyncUser::class,键名是命令名(如'user:sync'),值必须是完整类名加::class - 注册后务必运行
php think list验证——命令出现在列表里,才是真注册成功
参数和选项怎么取才不为空
ThinkPHP 不自动解析未声明的输入。所有参数、选项都得先在 configure() 里注册,再读取。
立即学习“PHP免费学习笔记(深入)”;
- 位置参数(如
php think user:sync admin中的admin):用$this->addArgument('name', Argument::REQUIRED),然后$input->getArgument('name') - 选项参数(如
--force或--limit=100):用$this->addOption('force', 'f', Option::VALUE_NONE)或$this->addOption('limit', null, Option::VALUE_REQUIRED) - 取值时别直接用
$input->getOption('force')判断真假——--force返回true,--force=1返回'1',未传则为null;稳妥写法是$input->hasOption('force')
CLI 环境下执行逻辑怎么写才不崩
命令行没有 Web 请求上下文,Db、Model、Log 等直接调用容易报错。
- 数据库操作前加
$this->app->db->connect()或app('db')->connect(),确保连接可用 - 模型建议用依赖注入:
public function execute(Input $input, Output $output, User $userModel),避免 new UserModel() - 日志必须指定通道:
Log::channel('cli')->info('Start sync'),否则可能静默丢弃 - 定时任务跑在 crontab 里时,一定要
cd /path/to/project && /usr/bin/php think user:sync,不能只写 php 路径



















