答案是先查缓存路径composer config --global cache-dir和系统临时目录php -r "echo sys_get_temp_dir();",确认归属并用sudo chown -R $USER:$USER修复,或清空重建;WSL/Docker需避免/mnt/c/或挂载点权限冲突。

临时目录写入失败时,先确认 Composer 正在用哪个路径
Composer 的临时行为(下载、解压、缓存)依赖多个路径:系统 /tmp、用户级 ~/.composer/cache、以及某些场景下 WSL 的 /mnt/c/ 或 Docker 的挂载点。错误信息里若出现 failed to open stream 且路径含 /tmp、cache 或 Extracting archive,基本可锁定是临时路径问题。
查当前生效的缓存目录:composer config --global cache-dir;查系统临时目录:php -r "echo sys_get_temp_dir();"。这两个路径必须对当前用户可写。
常见错误现象:
-
Writing cache file ~/.composer/cache/repo/https---packagist.org/报 Permission denied - 卡在
Extracting archive步骤,加-v后看到mkdir(): Permission denied - WSL 下报错路径含
/mnt/c/Users/...,但你在~/projects/下执行命令
清理并重设 ~/.composer/cache 权限
这是最常被污染的临时路径。即使 vendor/ 没问题,缓存目录属主为 root 也会导致后续所有 install、update 失败。
安全清理步骤:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
ls -ld $(composer config --global cache-dir),确认 owner 是否为当前用户 - 若显示
root,执行:sudo chown -R $USER:$USER $(composer config --global cache-dir) - 手动清空再重建(更彻底):
rm -rf $(composer config --global cache-dir) && mkdir -p $(composer config --global cache-dir) && chmod 755 $(composer config --global cache-dir) - 注意:不要用
chmod 777,755足够,且避免 CI 扫描告警
系统 /tmp 或 WSL /mnt/c/ 路径不可写怎么办
Composer 默认会 fallback 到 sys_get_temp_dir() 返回的路径。如果该路径被挂载为只读、ACL 限制或 UID 不匹配(尤其 WSL),就会静默失败。
典型场景和应对:
- WSL 用户在
/mnt/c/下跑composer install→ 错误根源是 Windows ACL + Linux UID 冲突。解决方案:把项目移到~/projects/等原生路径,别碰/mnt/ - Docker 容器内执行失败 → 检查
/tmp是否被tmpfs挂载且空间不足,或基础镜像(如 Alpine)默认umask过严。可在Dockerfile开头加:RUN mkdir -p /tmp/composer && chmod 1777 /tmp/composer,再通过环境变量指定:COMPOSER_CACHE_DIR="/tmp/composer/cache" - CI 流水线(如 GitHub Actions)报错 → 默认用户非 root,但某些 PHP 镜像未初始化
~/.composer目录权限。开头加:mkdir -p $HOME/.composer/cache && chmod 700 $HOME/.composer/cache
为什么修复了 vendor/ 还是报临时目录错
很多人修完 vendor/ 就以为万事大吉,结果 composer update 又挂了。这是因为 vendor/ 是输出目录,而临时操作(下载包、解压 zip、生成 lock 文件)全发生在别处——cache、/tmp、甚至 COMPOSER_HOME 指向的任意路径。
最容易被忽略的点:
- 错误信息里写的路径,不一定是你要修的目录,而是它上游依赖的临时路径。比如
file_put_contents(./vendor/autoload.php)失败,真正原因是解压时无法往~/.composer/cache/files/写中间文件 -
COMPOSER_HOME环境变量被意外设置为/root/.composer或/var/www/.composer,导致所有缓存、auth、插件都往非用户目录写 - PHP 自身的
sys_temp_dir(见php -i | grep sys_temp_dir)指向一个受限路径,比如 Windows 下的C:\Users\XXX\AppData\Local\Temp\,而该目录子目录被杀毒软件锁死

















