报错出现/tmp或extracting archive时,应检查php sys_temp_dir和composer缓存路径归属,优先用sudo chown -r $user:$user修复~/.composer/cache及tmpdir指向目录,禁用chmod -r 777。

报错里出现 /tmp 或 Extracting archive 就查临时目录归属
Composer 在下载、解压、缓存时会用到系统临时路径,比如 /tmp、~/.composer/cache,甚至 WSL 下的 /mnt/c/Temp。一旦这些位置属主是 root 或挂载为只读,就会卡在 Extracting archive 或抛出 failed to open stream ——但错误信息未必直接说“临时目录”,得看完整路径。
先确认 Composer 实际用的缓存和临时路径:
-
composer config --global cache-dir(通常为~/.composer/cache) -
php -i | grep "sys_temp_dir"(PHP 自身的临时目录,影响解包) - 运行
composer install -v,看 verbose 输出里Writing cache file或Using temp directory后面跟的是哪条路径
修复 ~/.composer/cache 权限:chown 而非 chmod
90% 的缓存写入失败,是因为 ~/.composer/cache 目录被 sudo 污染过,属主变成 root。这不是权限位(如 755)不够,而是所有权错配。
安全修复步骤:
- 删掉旧缓存:
rm -rf $(composer config --global cache-dir) - 重建目录:
mkdir -p $(composer config --global cache-dir) - 归还所有权:
sudo chown -R $USER:$USER $(composer config --global cache-dir) - 设合理权限:
chmod 755 $(composer config --global cache-dir)(不是 777)
如果整个 ~/.composer 都是 root 所有,直接修根目录:sudo chown -R $USER:$USER ~/.composer
PHP sys_temp_dir 不可写?别改全局配置,先查真实路径
Composer 解包失败(尤其 Alpine 或 Windows PHPStudy 环境)常因 PHP 的 sys_temp_dir 指向一个受限路径,比如 C:\Users\XXX\AppData\Local\Temp\ 或 /var/tmp。这时 file_put_contents 报错,但路径跟你项目无关。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
定位方法:
- 运行
php -i | grep "sys_temp_dir",拿到真实路径 - 手动进该路径,检查
ls -ld和touch test.tmp是否成功 - 若失败,不要硬改
php.ini;优先在当前 shell 设置环境变量:export TMPDIR="$HOME/tmp" && mkdir -p "$HOME/tmp",再跑composer install
Windows 用户注意:PHPStudy、XAMPP 等集成环境常把 sys_temp_dir 指向用户目录下带空格或 ACL 限制的子目录,建议换用官方 PHP + CLI 模式验证。
Docker / WSL 场景下临时目录更脆,提前隔离缓存路径
在容器或 WSL 中,/tmp 或宿主机挂载的 /mnt/c 很可能默认属 root,或 UID 不匹配。此时靠 chown 无效(尤其 WSL metadata=false 时)。
推荐做法是绕过系统临时目录,强制用项目内可写路径:
- 创建本地缓存目录:
mkdir -p .composer-cache && chmod 700 .composer-cache - 绑定环境变量:
COMPOSER_CACHE_DIR="$PWD/.composer-cache" - 执行安装:
COMPOSER_CACHE_DIR="$PWD/.composer-cache" composer install
CI 流水线(GitHub Actions / GitLab CI)中务必加这一步——基础镜像的 /tmp 权限不可信,且不同 runner 的 UID 可能不一致。
最容易被忽略的是:报错路径里写的 vendor/autoload.php 只是“最后一公里”,真正卡住的可能是上游某个临时解压目录,而那个目录在 /tmp 或 ~/.composer/cache 里,根本不会出现在你项目的 git 工作区中。










