卡在“Loading composer repositories”不是网络慢,而是Composer正扫描所有配置仓库;需用composer install -v观察末行是否停在此处,再检查repositories数组、全局配置及镜像设置。

composer install 卡在 Loading composer repositories 时怎么查
这不是网络慢,而是 Composer 正在尝试扫描所有配置的仓库(包括 repositories 里的私有源、path 类型本地包、甚至被注释掉但语法合法的条目)。它不会报错,只是一直卡住。
执行 composer install -v(不是 -vvv),观察输出最后一行是否停在 Loading composer repositories with package information。如果是,说明问题出在仓库连接环节:
- 检查
composer.json中repositories数组——删掉所有非必需的私有源,尤其是type: "package"或未配置认证的vcs条目 - 运行
composer config --list | grep repos,确认没有全局配置(~/.composer/config.json)偷偷注入了不可达仓库 - 若用阿里云镜像,确保已执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/;否则默认走 packagist.org,在国内常因 DNS 或 TLS 握手失败静默超时
报错 Class not found 却没提示具体类名
这通常发生在启用了 --classmap-authoritative(即 -a)但 classmap 不完整时。autoloader 直接放弃 fallback,连错误堆栈都来不及生成就 crash。
先验证 classmap 是否真包含你要的类:
- 打开
vendor/composer/autoload_classmap.php,搜索类名全称(如App\Controllers\HomeController) - 若没找到,说明该类没被扫描进 classmap——检查它所在目录是否在
autoload或autoload-dev的 PSR-4 配置中,且路径是绝对路径($baseDir . '/src') - 确认该文件本身可被 PHP 解析:无 BOM、无短标签(
)、无.php.bak后缀残留 - 临时去掉
-a参数重跑composer install,看是否报出具体 missing class,再反向定位缺失原因
部署后日志里出现 sh: git: not found 或 zip: not found
生产机没装 git 或 unzip,但 Composer 默认优先走 source(git clone)或需要解压 zip 包。它不会提前报错,而是在安装某个包时突然中断。
必须强制走预编译分发包并禁用所有外部命令:
- 加
--prefer-dist:跳过 git clone,直接下载 zip/tar 包 - 加
--no-scripts:防止触发依赖包自带的post-install-cmd(比如某些包会调用git rev-parse获取版本) - 确保
ext-zip已启用(php -m | grep zip),否则即使有 zip 包也无法解压 - 若仍失败,检查
composer.lock里对应包的dist.type字段——应为zip,而非tar或source
为什么 dump-autoload -v 显示扫描了路径,但类还是加载不到
composer dump-autoload -v 只告诉你“我看了这个目录”,不保证目录下所有文件都被解析。常见静默失败点:
- 文件名含大写字母但系统是大小写不敏感的(如 macOS / Windows):类
FooBar.php声明class foobar,PSR-4 规则会匹配失败 - 命名空间声明与目录结构不一致:例如
"App\": "src/",但src/Controllers/HomeController.php里写的是namespace AppControllers;✅,若写成namespace Appcontroller;❌(小写 c)则不会映射 -
autoload和autoload-dev混用:生产环境跑--no-dev,但把测试工具类写在顶层autoload里,导致 classmap 里塞了本不该存在的路径,运行时 stat() 失败又不报错 - 最终映射路径是否真实存在?
vendor/composer/autoload_psr4.php里看到的是$baseDir . '/src',手动执行php -r "echo __DIR__ . '/src';"看输出路径,再ls -l确认该路径下真有文件


















