先清临时目录(sys_get_temp_dir()),再清Composer全局缓存;临时目录中的composer_*.zip等文件不走缓存机制,必须手动清理,否则易致安装卡死、inode耗尽或超时。

先清临时目录,再清 Composer 全局缓存
临时目录(sys_get_temp_dir())里的 composer_*.zip、解压残留、PHP 运行时生成的临时 autoload 文件,是安装卡死、磁盘 inode 耗尽、Operation timed out 的第一诱因。它不走 Composer 缓存机制,也不受 cache-files-ttl 管控,必须手动或脚本优先清理。
常见错误现象:
-
df -i显示 inode 100%,但du -sh看磁盘使用率才 30% - 执行
composer install卡在 “Downloading …” 后无响应 - Windows 下报错
Could not delete …: Permission denied,实为%TEMP%中文件被占用
实操建议:
- Linux/macOS:运行
find $(php -r "echo sys_get_temp_dir();") -name "composer_*.zip" -delete 2>/dev/null - Windows:PowerShell 中用
Remove-Item "$env:TEMP\composer_*.zip" -Force -ErrorAction SilentlyContinue - 别等
composer clear-cache执行完再动手——它不碰这个目录
清全局缓存前,先确认缓存路径和占用情况
composer clear-cache 默认只删 $(composer config --global cache-dir) 下的内容,而这个路径可能不在你预期的盘符上(比如 Windows 默认在 C 盘 %APPDATA%\Composer\Cache,但你希望它在 D 盘)。
容易踩的坑:
- 直接跑
composer clear-cache,结果发现缓存根本不在默认位置(公司镜像或 CI 配置了自定义cache-dir) - 没检查大小就清,结果发现只占 200MB,而真正吃空间的是
vendor/或node_modules/ - 误以为清了缓存就能释放几十 GB——其实
cache/files/通常就几 GB,cache/vcs/可能更大些
实操建议:
- 先查路径:
composer config --global cache-dir - 再看体积:
du -sh $(composer config --global cache-dir)(Linux/macOS)或资源管理器打开对应路径(Windows) - 若缓存目录在小容量分区,立刻迁走:
composer config --global cache-dir "D:\composer-cache"
私有包更新后,必须按顺序删 repo + files 子目录
私有源(如 GitLab、Satis)更新了包代码或 tag,但 composer update 仍拉旧版,问题不在 lock 文件,而在缓存没清对地方。Composer 对私有源元数据缓存极其“固执”,不会自动刷新。
关键点:
- 元数据缓存路径由私有源 URL 转义而来,例如
https://gitlab.example.com→https---gitlab.example.com - dist 包缓存路径含 hash,不能只删整个
files/,否则公共包也要重下 - 删错目录(比如误删
repo/packagist.org/)会导致首次update卡住数分钟
实操建议:
- 定位 repo 缓存:
rm -rf $(composer config --global cache-dir)/repo/https---gitlab.example.com - 定位 dist 缓存:从
composer.lock提取目标包的shasum,再删对应files/{vendor}/{package}/{hash}/ - CI 场景可偷懒:
rm -rf $(composer config --global cache-dir)/files/*,但repo/和vcs/保留
post-install-cmd 钩子里不能删 vendor/composer/autoload_*.php
很多人在 composer.json 的 post-install-cmd 里写 rm -f vendor/composer/autoload_*.php,以为能“强制重生成”,结果后续命令(比如 php artisan optimize)直接报 Class 'Composer\Autoload\ClassLoader' not found。
为什么不能删:
-
vendor/composer/autoload_*.php是 Composer 自动加载器运行必需的入口文件,不是“缓存” - 钩子执行时
vendor/autoload.php已生成,但框架尚未初始化,php artisan类命令依赖这些文件 - 删了等于让整个 autoloader 失效,不是清理,是破坏
实操建议:
- 要重生成 autoload,用
composer dump-autoload,而不是手动删文件 - 清理目标应聚焦在项目级缓存:
bootstrap/cache/*.php、storage/framework/views/、public/build/ - 所有清理命令前加
[ -d "path" ] && rm -rf path/*,避免路径不存在时报错中断
真正卡点在于临时目录和私有源缓存的耦合性——它们不进常规流程,却决定命令是否能跑通。一旦漏掉 sys_get_temp_dir() 或私有 repo/,再怎么调 cache-files-ttl 或跑 --gc 都是白忙。











