Composer install卡在downloading或解析超时,主因是仍直连packagist.org;需全局换阿里云镜像(加-g)、清缓存、禁用脚本与dev依赖,三步可提速3倍以上。

composer install 卡在 downloading 或解析超时,不是 ThinkPHP 慢,是 Composer 还在连 packagist.org。换国内镜像 + 清缓存 + 关脚本,三步就能让初始化快 3 倍以上。
为什么全局配置 repo.packagist 必须加 -g
不加 -g 的 composer config repo.packagist 只改当前目录下的 composer.json,对新项目、create-project、CI 环境完全无效。真正生效的是写入 ~/.composer/config.json 的全局配置。
- 正确命令:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否生效:
composer config -g repo.packagist,输出应为{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}(新版 Composer 也可能只输出 URL 字符串,只要不是https://packagist.org就算成功) - 如果输出为空或报错
Could not open input file: composer,说明composer未加入系统 PATH,查安装路径(如/usr/local/bin/composer)并补环境变量 - 阿里云镜像同步延迟通常 ≤5 分钟,比清华、腾讯更及时;若公司内网有私有源,优先配它,但需确认已同步
topthink/framework等核心包
composer install 初始化时必须禁用的三项
ThinkPHP 启动前的 vendor/ 构建阶段,脚本、自动加载、开发依赖全是拖慢主流程的冗余环节。
-
--no-dev:跳过phpunit/phpunit、phpstan/phpstan等大体积 dev 包,省下 40%+ 时间 -
--no-scripts:避免post-autoload-dump、post-root-package-install等脚本因权限或路径失败中断安装(比如清runtime/目录失败) -
--no-autoloader:不生成vendor/autoload.php,装完再单独跑composer dump-autoload -o,既提速又可控 - 完整推荐命令:
composer install --no-dev --no-scripts --no-autoloader --prefer-dist
为什么 composer.json 里不能留 @dev 和 prefer-stable: false
ThinkPHP 项目中残留这些配置,会让 Composer 在解析阶段反复查询不稳定分支元数据,不是下载慢,是“卡在计算该拉哪个版本”。
- 检查并删除所有显式出现的
"dev-master"、"@dev"、"dev-develop" - 确认
"minimum-stability"是"stable",不是"RC"或"beta" - ThinkPHP 6.x/8.x 推荐锁定小版本,例如
"topthink/framework": "^6.3.0",而非宽泛的"^6.3",避免意外拉到未经充分测试的补丁版 - 若已存在
composer.lock,执行composer update topthink/framework --with-dependencies时也要先清理这些不稳定约束,否则 lock 文件会保留错误路径
初始化完成后别忘了这两件事
跳过脚本和 autoload 不影响最终功能,但漏掉后续动作会导致 ThinkPHP 启动失败或类找不到。
立即学习“PHP免费学习笔记(深入)”;
- 手动补 autoload:
composer dump-autoload -o(-o启用优化,生成 classmap 加速类查找) - 手动补关键脚本(如需):
composer run-script post-autoload-dump,尤其当用了topthink/think-queue这类需建表的插件时,跳过脚本后得自己执行迁移 - 务必提交
composer.lock到 Git —— 它锁定了所有依赖精确版本,否则别人composer install会拉到不同版本,引发Class 'think\App' not found这类运行时错误
composer.lock 没删干净、以及 Windows 下 PHP 路径含空格或中文导致 autoload 异常。换源只是第一步,后面这三步不做,初始化照样卡住。



















