Composer在Windows上的临时文件实际存于系统临时目录(即%TEMP%,默认C:\Users\用户名\AppData\Local\Temp),而非vendor或%APPDATA%\Composer\Cache;composer clear-cache不清理该目录,故磁盘满时应优先清理其中composer_.zip及空的composer_extract_文件夹。

Windows下Composer临时文件藏在哪
Composer在Windows上真正吃磁盘、又常被忽略的临时文件,不在vendor或%APPDATA%\Composer\Cache,而是在系统临时目录——也就是PHP函数sys_get_temp_dir()返回的位置。默认是C:\Users\用户名\AppData\Local\Temp。这里会堆积大量composer_*.zip、解压中途失败的临时目录、以及php.exe调用proc_open时生成的匿名临时文件。
为什么composer clear-cache不解决磁盘满问题
因为composer clear-cache只清理%APPDATA%\Composer\Cache下的files/、vcs/等子目录,完全不碰%TEMP%。而Windows下%TEMP%和%LOCALAPPDATA%\Temp往往指向同一位置,且Composer下载、解压、运行脚本(比如post-install-cmd)时高频使用它。一旦磁盘告警,先查这个目录,比清缓存更有效。
- 运行
echo %TEMP%确认路径(通常就是C:\Users\xxx\AppData\Local\Temp) - 进该目录后搜索
composer_*.zip、php*.tmp、temp_*.phar等关键词 - 别删整个
Temp目录——可能影响其他程序;优先删composer_*.zip和空的composer_extract_*文件夹 - 若发现大量
php*.bat或php*.exe残留,说明有Composer脚本异常退出,没清理子进程
怎么安全自动清理这些临时文件
不能靠post-install-cmd钩子直接删%TEMP%——权限不足、路径不确定、容易误伤。推荐用PowerShell脚本+计划任务,或部署前手动执行:
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
- 新建
clean-composer-temp.ps1,内容:Get-ChildItem "$env:TEMP" -Filter "composer_*.zip" | Remove-Item -Force Get-ChildItem "$env:TEMP" -Directory -Filter "composer_extract_*" | ForEach-Object { if ((Get-ChildItem $_.FullName -Recurse | Measure-Object).Count -eq 0) { Remove-Item $_.FullName -Force } } - 以管理员身份运行该脚本(仅首次需要;后续普通用户也能删自己名下的
Temp文件) - 加到CI/CD流程里:用
powershell -ExecutionPolicy Bypass -File clean-composer-temp.ps1 - 注意:不要在
post-install-cmd里调用del /q %TEMP%\composer_*.zip——Windows CMD无法展开%TEMP%变量,会静默失败
容易被忽略的inode耗尽问题
Windows没有inode概念,但NTFS有类似限制:单个目录下文件数超百万、或小文件过多时,dir变慢、del报“找不到文件”、甚至PHP的scandir()返回空数组。此时df -i无效,得看fsutil volume diskfree C:里的“可用簇数”。清理%TEMP%是最快见效的手段,尤其当看到成千上万个composer_*.zip时,别犹豫,直接删。










