报错含 /tmp 或 extracting archive 时,应检查 php sys_temp_dir 和 tmpdir 指向的临时目录权限;90% 缓存失败源于 ~/.composer/cache 被 root 占用,需删缓存、重建并 chown 归还所有权;docker/wsl/windows 下建议用 tmpdir 或 composer_cache_dir 指定可信路径,并分别验证临时目录与缓存目录可写性。

报错里出现 /tmp 或 Extracting archive 就查临时目录归属
Composer 在解压包、生成 autoload 文件、写缓存时,会用到系统临时路径——不一定是项目内的 vendor/,而是 PHP 自己挑的 sys_temp_dir 或环境变量 TMPDIR 指向的位置。错误信息里一旦出现 /tmp、/var/tmp、C:\Users\XXX\AppData\Local\Temp\ 或 Extracting archive 字样,基本可以锁定是这里卡住了。
先确认 Composer 实际用了哪个临时路径:
- 运行
php -i | grep "sys_temp_dir",看 PHP 当前配置的临时目录 - 运行
composer install -v,在 verbose 输出里找Using temp directory或Extracting archive to后面的路径 - 检查环境变量:
echo $TMPDIR,它会覆盖 PHP 默认值
~/.composer/cache 被 root 占了?删掉重建比硬修更稳
90% 的缓存写入失败,根源不是权限位(比如 755 不够),而是 ~/.composer/cache 目录本身属主是 root——通常因为某次误用 sudo composer install 污染了整个缓存树。这时候改 chmod 没用,必须归还所有权。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
但与其逐层 chown,不如直接清理重来:
- 删掉旧缓存:
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)
Docker / WSL / Windows 下的 sys_temp_dir 更容易翻车
这些环境里,PHP 的 sys_temp_dir 常指向一个挂载点或 ACL 限制路径(比如 WSL 的 /mnt/c/Temp、Windows PHPStudy 的用户目录子路径),普通用户根本没写权限。硬改 php.ini 不现实,也容易被覆盖。
务实做法是绕开它:
- 临时指定可信路径:
export TMPDIR="$HOME/tmp" && mkdir -p "$HOME/tmp",再跑composer install - Docker 中避免挂载
/tmp:改用项目内缓存,加COMPOSER_CACHE_DIR=".composer-cache"并提前mkdir -p .composer-cache && chmod 700 .composer-cache - Windows 上若报
Access is denied且错误出现在生成.bat或phpunit脚本时,大概率是杀软拦截,临时关掉 Windows Defender 实时防护试试
最容易被忽略的是:sys_temp_dir 和 cache-dir 可能分属不同磁盘或挂载分区,一个修好了,另一个仍只读。每次修复后,务必用 touch $(php -r "echo sys_get_temp_dir();")/test 和 touch $(composer config --global cache-dir)/test 分别验证可写性。










