“No space left on device”错误主因是临时目录inode耗尽或空间占满,非磁盘块不足;应先用php -r "echo sys_get_temp_dir();"定位路径并清理composer_*.zip等文件,再通过--prefer-source跳过ZIP解压,或重定向TMPDIR/sys_temp_dir至独立可写分区。

Zip流解压卡在Downloading阶段,报No space left on device
这不是网络慢或镜像源问题,而是 Composer 在内存不足时 fallback 到磁盘解压 ZIP 流,临时写入 sys_get_temp_dir() 目录,而该目录(Windows 是 C:\Users\用户名\AppData\Local\Temp,Linux/macOS 是 /tmp)往往 inode 已耗尽或空间被占满。
典型现象:下载进度条卡在 99%,日志末尾出现 file_put_contents(): No space left on device 或 ZipArchive::extractTo(): failed to open stream;df -h 显示磁盘还有几十 GB,但 df -i 显示对应分区 Use% ≥ 95%。
- 先验证真实临时路径:
php -r "echo sys_get_temp_dir();" - Windows 用户直接打开资源管理器,粘贴该路径,搜索
composer_*.zip和php*.phar手动删除 - Linux/macOS 运行:
find $(php -r "echo sys_get_temp_dir();") -name "composer_*" -o -name "php*.phar" -delete 2>/dev/null - 切勿
rm -rf /tmp—— 可能误删其他进程正在使用的临时文件
让Composer跳过磁盘解压,强制走内存解压
Composer v2.2+ 默认启用内存解压(memory_limit 足够时),但若 PHP 配置过低或 ZIP 包过大(如 Laravel、Symfony 全量包),仍会退回到磁盘。关键不是调大 memory_limit,而是关闭磁盘 fallback。
做法是禁用 ZIP 缓存并强制使用 source 安装(绕过 ZIP 解压环节):
- 关掉 dist 缓存:
composer config --global cache-files-dir false(注意填字符串false,不是布尔值) - 启用 source 模式:
composer config --global prefer-source true - 加装时指定:
composer install --prefer-source或composer update --prefer-source - 效果:跳过 ZIP 下载与解压,直接 git clone,不写临时 ZIP 文件,大幅降低
sys_get_temp_dir()压力
临时目录重定向:治标也治本
改 sys_get_temp_dir() 全局行为会影响其他 PHP 应用,但可以只对 Composer 生效——通过环境变量或 PHP 启动参数覆盖。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Linux/macOS(推荐):
TMPDIR="/mnt/data/tmp" php -d sys_temp_dir="/mnt/data/tmp" composer install
Windows PowerShell:
$env:TMP="D:\temp"; $env:TEMP="D:\temp"; php "-d" "sys_temp_dir=D:\temp" composer install
- 目标目录必须存在且可写:
mkdir -p /mnt/data/tmp && chmod 1777 /mnt/data/tmp - 验证是否生效:
php -d sys_temp_dir="/mnt/data/tmp" -r "echo sys_get_temp_dir();"输出应为你指定路径 - 别用 NFS 或远程挂载点——
ZipArchive::extractTo()在这类文件系统上易报Permission denied
vcs/ 目录才是 Zip 解压失败的隐藏推手
很多人清理了 ~/.composer/cache/files/ 却仍爆满,是因为 ~/.composer/cache/vcs/ 里存着完整 Git 裸仓库(每个包一个 .git),单个可达 300–800MB,且 composer clear-cache 默认不清理它。
安全清理方式(确保无 composer install/update 正在运行):
- 查路径:
composer config --global cache-dir - 删 vcs:
rm -rf $(composer config --global cache-dir)/vcs/* - 后续防复发:
composer config --global cache-vcs-dir false(Composer v2.5+ 支持) - 如果用了私有 GitLab/GitHub,建议搭配
--no-plugins和--no-scripts减少临时 clone
真正容易被忽略的是:vcs 目录和临时 ZIP 文件共同挤压同一分区的 inode,哪怕你清了缓存、换了临时目录,只要 vcs/ 还在原地,下次 update 仍可能触发爆满。动手前,先 df -i 看清哪个挂载点扛不住。

















