ThinkPHP用Composer安装失败,90%是PHP环境不匹配、镜像源未切换或composer.lock残留所致;应先删vendor和composer.lock,再换阿里云镜像重装,并确认PHP≥7.4、json/mbstring/xml/curl/openssl/phar/zlib扩展全启用。

ThinkPHP 用 Composer 安装失败,90% 不是 Composer 本身的问题,而是 PHP 环境没配对、镜像源没切对、或 composer.lock 残留干扰——直接删 vendor 和 lock 文件重装,大概率就能过。
PHP 版本和扩展不满足要求就根本走不到下载那步
Composer 在解析 composer.json 时会严格校验 php 和 ext-xxx 依赖,缺一个就静默退出(Exit Code 1 或 255),不报具体缺啥。
- 运行
php -v确认 ≥ 7.2.5(TP6 推荐 ≥ 7.4;TP8 要 ≥ 8.0) - 运行
php -m | grep -E "(json|mbstring|xml|curl|openssl|phar|zlib)",确保全部在列表里 - Windows 用户注意:
php --ini查 CLI 加载的php.ini路径,别只改 Apache 那份 - Ubuntu/macOS 上缺扩展,得单独装:比如
sudo apt install php-mbstring php-xml php-curl或brew install php@8.2-curl
“Connection refused” 或卡在 Downloading 是镜像源问题,不是你网络坏了
国内直连 packagist.org 基本不可用,换阿里云镜像后重试,别反复 install。
- 执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(加-g才全局生效) - 验证是否生效:
composer config -g repo.packagist输出应含"url": "https://mirrors.aliyun.com/composer/" - 删掉项目下的
vendor/和composer.lock(composer.lock锁死了旧约束,不删它install就不会更新) - 再跑
composer install——别用update,它会重新解依赖树,容易引入意外版本
装完访问报 Class 'thinkApp' not found,大概率是入口或自动加载断了
这不是没装成功,是类没被正确加载。TP6+ 的核心类不靠手动 require,全靠 vendor/autoload.php 注册 PSR-4 映射。
立即学习“PHP免费学习笔记(深入)”;
- 检查
public/index.php第一行是不是require __DIR__ . '/../vendor/autoload.php'; - 运行
php think,能输出命令列表说明 autoload 生效;如果报Class 'thinkApp'错,就是autoload.php没引入或路径错 - 别把
index.php放错目录——必须从public/下访问,不能直接访问项目根目录 - 确认
vendor/composer/autoload_psr4.php里有'think\' => array($vendorDir . '/topthink/framework/src')这行映射
composer why 和 composer prohibits 是定位依赖冲突的唯二有效命令
报错如 Conclusion: don't install thinkphp/framework v6.0.10,本质是多个包对 topthink/framework 的版本要求互相打架,不是某个包“坏了”。
- 先跑
composer why topthink/framework,看哪些已安装包显式依赖它 - 再跑
composer prohibits topthink/framework:6.0.10(把版本换成报错里写的),查谁在拦这个版本 - 常见冲突源:
topthink/think-queue、topthink/think-swoole还锁在 TP5 分支,却混进 TP6 项目 - 第三方扩展若写
"topthink/framework": "^6.0",实际可能拉到 6.3,但该扩展只测过 6.0–6.1——得去 GitHub issues 搜 “6.3” 确认兼容性
最常被忽略的一点:同一台机器上并存 TP5 和 TP6 项目时,composer dump-autoload 可能互相污染——因为 Composer 全局缓存区(COMPOSER_HOME)被共享了,尤其在 Docker 或 CI 环境下。这时候得加 --no-cache 或显式指定 COMPOSER_HOME 隔离。



















