答案是临时文件写入失败源于系统临时目录(如/tmp)权限不足,应通过export tmpdir="$home/composer-tmp"指定私有临时目录并设chmod 700,而非修改系统/tmp权限。

composer install 临时文件写入失败,先看错误路径在哪
报错里带 /tmp/composer、/var/tmp 或 sys_get_temp_dir() 返回的路径,就说明 Composer 正在用系统临时目录;如果报 file_put_contents(/tmp/composer_archive...): failed to open stream: Permission denied,问题不在项目目录,而在临时目录本身。常见于 CentOS、Ubuntu 的多用户服务器或 Docker 容器中,/tmp 被挂载为 noexec 或属主为 root:root,而当前用户无写权限。
改临时目录比修 /tmp 权限更安全可靠
不要尝试 chmod 1777 /tmp 或 chown $USER:$USER /tmp——这会破坏系统安全机制。正确做法是让 Composer 使用你可控的私有临时目录:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 创建专属目录:
mkdir -p ~/composer-tmp && chmod 700 ~/composer-tmp - 临时生效(当前终端):
export COMPOSER_CACHE_DIR="$HOME/composer-tmp"(注意:这不是缓存目录,但 Composer 会复用该变量控制解压行为) - 更稳妥方式是设
sys_temp_dir配置:php -r "echo sys_get_temp_dir();"确认当前值,再通过环境变量覆盖:export TMPDIR="$HOME/composer-tmp" - 验证是否生效:
php -r "echo sys_get_temp_dir();"应输出你的路径
为什么 COMPOSER_CACHE_DIR 不总管用?
COMPOSER_CACHE_DIR 只影响包下载后的缓存(如 packages.json),不影响 install 过程中解压 ZIP、生成临时归档等操作——这部分走的是 PHP 底层的 sys_get_temp_dir()。所以即使你设了 COMPOSER_CACHE_DIR,仍可能卡在 Extracting archive 阶段。真正起效的是 TMPDIR(Unix/Linux/macOS)或 TEMP/TMP(Windows)环境变量。
CI/CD 或 Docker 中的典型配置
在 GitHub Actions、GitLab CI 或自建 runner 里,别依赖默认 /tmp:
- Dockerfile 中加:
ENV TMPDIR=/tmp/composer ENV COMPOSER_CACHE_DIR=/tmp/composer/cache,并在 RUN 前RUN mkdir -p /tmp/composer/cache && chmod 700 /tmp/composer - GitHub Actions 中写:
env: TMPDIR: ${{ github.workspace }}/tmp,配合run: mkdir -p ${{ github.workspace }}/tmp - 避免用
sudo composer install:它会让临时文件属主变成 root,后续普通用户无法清理,导致composer update卡在 “Deleting /tmp/composer_XXXX”
TMPDIR,而不是硬刚系统 /tmp。










