ThinkPHP安装慢的根本原因是Composer默认直连不可用的packagist.org,需全局切换阿里云镜像(composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/)、清缓存(composer clear-cache)、禁用dev依赖与脚本,并删除@dev等不稳定版本约束,方可实现5秒内完成依赖解析。

ThinkPHP安装慢,基本就是 Composer 还在连 packagist.org ——不是你网络差,是默认源在国内根本不可用。换阿里云镜像 + 清缓存 + 关掉干扰项,5 秒内完成依赖解析很常见。
composer config -g repo.packagist 必须加 -g 且写对键名
不加 -g,命令只改当前项目的 composer.json,新项目、create-project、CI 环境全无效。真正生效的是写入 ~/.composer/config.json 的全局配置。
- 正确命令:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 键名必须是
repo.packagist(单数,不是repos.packagist) -
composer是 type 值,不能省;URL 必须以/结尾,否则拼成/composerpackages.json导致 404 - 验证是否成功:
composer config -g repo.packagist,输出应为{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}或至少是完整 URL 字符串
换镜像后仍卡在 Resolving dependencies?和镜像无关
镜像只加速下载(Downloading / Fetching),不解决依赖求解本身慢的问题。如果你卡在这一步超过 10 秒,大概率是项目里有不稳定版本约束。
- 删掉
composer.json中所有显式出现的"@dev"、"dev-master"、"dev-develop" - 确认
"minimum-stability"是"stable",不是"RC"或"beta" - ThinkPHP 6.x 推荐锁定小版本,如
"topthink/framework": "^6.3.0",而非"^6.3" - 若用
create-project装 TP8,必须加--stability=stable,否则默认拉dev-main,而阿里云镜像已过滤该类包
装完还慢?关掉这三项“隐形拖累”
ThinkPHP 启动前的 vendor/ 构建阶段,--no-dev、--no-scripts、--no-autoloader 全是可跳过的冗余环节,跳过能提速 3 倍以上,且不影响最终功能。
立即学习“PHP免费学习笔记(深入)”;
-
--no-dev:跳过phpunit/phpunit、phpstan/phpstan等大体积 dev 包 -
--no-scripts:避免post-autoload-dump因权限或路径失败中断(比如清runtime/失败) -
--no-autoloader:不生成vendor/autoload.php,装完再单独跑composer dump-autoload -o更稳 - 完整推荐命令:
composer install --no-dev --no-scripts --no-autoloader --prefer-dist
Windows 下 create-project 的隐藏陷阱
Windows cmd / PowerShell 不加双引号时,^ 符号会被吃掉,导致实际拉取的是 topthink/think:6.0.2(精确版本),而非语义化版本 ^6.0.2,极易因版本不存在报错。
- 正确写法:
composer create-project "topthink/think" tp-demo "^6.0.2" - 路径含中文或空格(如
D:\我的项目\)会导致 autoload 失败,务必用纯英文路径 - 若提示
file_get_contents(): SSL operation failed,大概率是openssl扩展没启用,不是镜像问题 - Xdebug 必须关——它会让依赖解析慢 5 倍以上,PHPStorm 默认开启,别忽略
最常被忽略的其实是 composer clear-cache:换镜像后不清理,旧元数据仍会触发 DNS 解析失败或 TLS 握手超时;还有项目级 repositories 字段会完全屏蔽全局镜像,检查 composer.json 是否存在该字段,有就删掉或临时用 --repository= 强制覆盖。



















