Composer vendor体积过大问题的根源是静态冗余内容而非临时文件,应通过--no-dev、--prefer-dist、discard-changes:true及.gitattributes过滤docs/tests/examples来安全瘦身。

Composer 没有“压缩临时文件”这个操作,它也不生成可被压缩的临时文件;你真正想解决的,是解压失败、磁盘爆满或 vendor 体积过大——而这三类问题,根源全在临时目录、ZIP 解压方式和安装策略上。
ZipArchive::extractTo(): failed to open stream 是临时目录权限/空间问题
这个错误不是 ZIP 包坏了,也不是路径配错了,而是 Composer 在系统临时目录(TMPDIR 或 /tmp)里解压时写不进去。PHP 的 sys_get_temp_dir() 返回哪,它就用哪,跟 cache-dir、vendor-dir 完全无关。
- 检查空间和 inode:
df -h /tmp && df -i /tmp,小分区上 /tmp 满了很常见 - 换大分区临时目录:
export TMPDIR="/mnt/bigdisk/tmp" && mkdir -p "$TMPDIR" && chmod 777 "$TMPDIR" - 别信
php -m | grep zip,必须实测:php -r "new ZipArchive(); echo 'OK';"不报错才算真可用
zlib_decode(): data error 多因 PHP zlib 流解析不稳定
尤其在 PHP 8.2+、WSL 或 Windows 下,遇到下载完立刻崩、堆栈带 zlib_decode,基本就是 zlib 对 ZIP64 或数据描述符支持不稳。
- 先清缓存:
composer clear-cache && composer install --no-cache - 关掉干扰项:确认 CLI 的
php.ini中zlib.output_compression = Off(不是0),zlib.encode = "" - 最稳方案:装好
7z或7zz,再运行COMPOSER_UNZIP=7zip composer install
vendor 体积大 ≠ 临时文件多,但常被误当成“临时”来删
很多人想“压缩 vendor 里的临时文件”,其实 vendor 里根本没临时文件——只有源码、测试、文档、.git 目录这些静态冗余内容。它们占体积常超 30%,但属于安装产物,不是运行时生成的临时物。
- 禁用 VCS 元数据:
"config": { "discard-changes": true },再重装(rm -rf vendor && composer install --no-dev) - 删 docs/tests/examples:项目根目录加
.gitattributes,写入/docs export-ignore等行,配合--prefer-dist - 别手动删
vendor/bin或autoload_*.php——它们要么是软链,要么是 autoload 必需,删了直接 break
真正该盯住的只有三个地方:TMPDIR 的写权限与空间、ZipArchive 是否真能 new 出来、composer.json 里有没有把运行时依赖错塞进 require-dev。其他所有“压缩”“清理”动作,都是在这三者确认无误之后才值得展开的后续步骤。


















