Composer 脚本慢主因是 post-install-cmd 不当触发及 autoload 优化未生效;应通过 COMPOSER_COMMAND 环境变量控制执行场景,精简 classmap、启用 OPcache/APCu,并确保镜像源与并发配置正确落地。

Composer 脚本运行慢,90% 是因为 post-install-cmd 在不该执行时反复触发,或 autoload 优化没生效。不是脚本本身慢,而是执行逻辑和环境配置错了。
post-install-cmd 总在 composer install 时跑,怎么禁掉?
它默认在 composer install 和 composer update 后都执行,哪怕 composer.lock 没变、vendor 已存在——这不是 bug,是 Composer 的设计行为。
- 常见后果:本地
install后自动跑npm run build或php artisan config:cache;CI 流水线里重复构建,拖慢部署 - 别用
--no-scripts掩耳盗铃,那只是跳过,没解决问题 - 真正解法是靠
COMPOSER_COMMAND环境变量区分场景:PHP 脚本里用getenv('COMPOSER_COMMAND') === 'update'判断;Shell 脚本里直接用$COMPOSER_COMMAND - 确保只在
update场景下执行耗时操作(如composer dump-autoload --optimize),install场景可完全跳过 - 单行 PHP 命令记得加引号,比如
php -r "if(getenv('COMPOSER_COMMAND')==='update'){...}",否则 shell 会提前解析=
autoload_classmap 为什么越开越慢?
autoload_classmap 是开发期生成的全量映射数组,生产环境加载它要反序列化几 MB 数据,而一次请求通常只用其中不到 5% 的类。
- 它只在同时满足
composer install --no-dev --optimize-autoloader且composer.json中没显式配置"classmap": []时才真正生效 - 删掉无用的
classmap条目,比如"tests/"、"docs/",它们只会增大体积、拖慢反序列化 - PSR-4 前缀要精简,避免重叠(如同时注册
"App\Http\Controllers\": "app/Http/Controllers/"和"App\Http\Middleware\": "app/Http/Middleware/"),否则每次 autoload 都要多做字符串比对和stat() - 若必须动态拼类名,改用
class_alias()或require_once关键文件,别依赖 autoload 抗压
dump-autoload --optimize 为啥没效果?
加了 --optimize 却没提速,大概率是 OPcache 或 APCu 没配好——光有 vendor/composer/autoload_classmap.php 文件还不够,每次请求仍要读取、反序列化。
-
opcache.enable=1必须开启,且推荐设opcache.validate_timestamps=0(生产环境) - APCu 缓存需扩展启用,并在引导代码中显式注册:
\Composer\Autoload\ClassLoader::register(true, 'composer_autoload_'.md5(__DIR__)) - 权威类映射(
--classmap-authoritative)虽快,但一旦类不在 map 中就直接报错,不适合含运行时类生成的项目 - 更安全的选择是
--apcu-autoloader,它缓存查找结果而非整个 map,不破坏 fallback 行为
镜像源和并发下载配置是否真生效?
换源后还卡在 Resolving dependencies 或下载慢,往往不是网络问题,而是配置没落地或被覆盖。
- 确认命令:新版 Composer(2.2+)必须用
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,少composer这个 type 就静默失效 - URL 末尾必须带
/,否则拼接出错(如变成https://mirrors.aliyun.com/composerp2/foo.json) - 验证方式:加
-vvv运行composer install,grepmirrors.aliyun,看到GET https://mirrors.aliyun.com/composer/p2/...才算真走镜像 - 并发下载已弃用
parallel-downloads,改用composer config -g http-max-concurrent-downloads 10 - 项目级
repositories会覆盖全局配置,CI 中推荐进项目目录执行composer config repo.packagist ...,再提交到 Git
最常被忽略的一点:所有 autoload 优化(--optimize-autoloader、--apcu-autoloader)都只在 install 或 dump-autoload 时生成,不会自动更新——改了 PSR-4 映射或增删类后,必须手动再跑一次,否则新类根本进不了优化路径。











