运行 php think 前需确保在项目根目录;自定义命令须放 app/command/ 下、类名以command结尾、configure()中调用setname();execute()中须先执行$this->app->initialize()才能使用db或模型。

直接在项目根目录运行 php think 就能列出所有可用命令,不需要额外配置或启动服务——这是 ThinkPHP6.0 命令行工具最基础也最关键的使用前提。
php think list 不显示自定义命令?检查这三处
常见错误现象是写好了命令类,但 php think list 里完全看不到它。
- 文件必须放在
app/command/目录下(不是app/commands或其他路径) - 类名必须以
Command结尾,比如SendEmailCommand,且文件名严格为SendEmailCommand.php -
configure()方法里必须调用$this->setName('send:email'),名字只能含小写字母、数字、冒号和下划线,不能有空格或大写
execute() 中调用 Db 或模型报 “No application initialized”
这是 TP6.0 命令行最常踩的坑:框架默认不自动初始化应用上下文,Db::、UserModel:: 等静态访问会直接崩溃。
- 必须在
execute()开头手动加一行:$this->app->initialize(); - 推荐改用容器方式获取实例,比如
$this->app->db替代Db::,$this->app->model(UserModel::class)替代new UserModel() - 避免在命令中直接
new UserModel(),否则事件、验证器、依赖注入全部失效
crontab 定时执行 php think 命令失败?路径和环境是关键
直接写 /usr/bin/php /var/www/myapp/think backup:db 很容易出错,因为 crontab 默认工作目录不在项目根,也读不到 .env 和 vendor/autoload.php。
- 正确写法是组合
cd+php think:*/30 * * * * cd /var/www/myapp && /usr/bin/php think backup:db > /dev/null 2>&1 - 绝对路径中不要用
~,$HOME在 crontab 下可能不等于你的用户主目录 - 确保
.env文件在项目根目录,且 crontab 运行用户(如 www-data)有读取权限
真正复杂的地方在于命令生命周期和应用上下文的耦合——configure() 只负责注册元信息,execute() 才真正运行逻辑,而这个逻辑是否能访问数据库、缓存、配置,全取决于你有没有显式初始化上下文。很多人卡在这一步,不是代码写错了,而是漏掉了那一行 $this->app->initialize();。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











