应设置TMPDIR(Linux/macOS)或TMP(Windows)环境变量强制覆盖sys_get_temp_dir()返回值,确保目标目录存在且当前用户有读写权限。

Composer 报错 sys_get_temp_dir() 返回路径不可写怎么办
直接结论:Composer 启动时会调用 sys_get_temp_dir() 获取系统临时目录,若该路径(如 /tmp 或 Windows 的 C:\Windows\Temp)对当前用户无写权限,就会卡在解包、下载或缓存阶段,典型错误是 Failed to extract … Permission denied 或 Could not write to /tmp/composer…。
怎么强制 Composer 使用自定义临时目录
不依赖系统默认值,改用环境变量覆盖是最稳妥的方式。Composer 会优先读取 COMPOSER_CACHE_DIR 和 COMPOSER_HOME,但真正影响解压和 ZIP 提取的是底层 PHP 的临时目录 —— 所以必须同时控制 sys_get_temp_dir() 的返回值。
- Linux/macOS:执行前设置
TMPDIR环境变量,例如TMPDIR=/home/youruser/tmp composer install - Windows(CMD):用
set TMP=C:\Users\YourUser\tmp && composer install - Windows(PowerShell):用
$env:TMP="C:\Users\YourUser\tmp"; composer install - 确保目标目录已存在且当前用户有读写权限:
mkdir -p /home/youruser/tmp && chmod 700 /home/youruser/tmp
注意:TMPDIR(Unix)和 TMP(Windows)是 PHP 原生识别的环境变量,sys_get_temp_dir() 会优先检查它们,比修改 php.ini 更轻量、更可复现。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么改 php.ini 的 sys_temp_dir 不一定生效
PHP 7.4+ 才支持 sys_temp_dir 配置项,且它只在 CLI SAPI 下生效(Web 环境如 Apache/Nginx 不读这个)。即使设置了,某些共享主机或容器环境会禁止修改 ini 值,或 Composer 进程被 wrapper 脚本启动导致配置未加载。
- 验证是否生效:运行
php -r "echo sys_get_temp_dir();",看输出是否为你设的路径 - 如果输出仍是
/tmp,说明环境变量未传递或版本太低,别硬调 php.ini - 容器中(如 Alpine)常见问题:基础镜像没建
/tmp,或挂载时用了ro,此时必须用TMPDIR指向一个明确rw的卷内路径
CI/CD 流水线里怎么稳定绕过权限问题
GitHub Actions、GitLab CI 等默认工作目录可写,但它们的系统 /tmp 可能被限制(尤其 runner 是 root 启动但降权执行时)。这时候不能靠“猜权限”,而要显式声明。
- GitHub Actions 示例:
env: TMPDIR: ${{ github.workspace }}/tmp steps: - run: mkdir -p $TMPDIR - run: composer install - GitLab CI 示例:
before_script: - export TMPDIR="$CI_PROJECT_DIR/.tmp" - mkdir -p "$TMPDIR"
- 避免用
~/.composer/cache当临时目录 —— Composer 缓存目录和提取临时目录是两回事,混用会导致ZipArchive::extractTo()失败
临时目录的核心要求只有两个:存在、可写、不跨文件系统(否则 rename() 可能失败)。只要满足,哪怕放在项目根目录下(如 ./.tmp)也完全可行 —— 别被“临时”二字带偏去硬刚系统路径。

















