composer报错“无法访问系统临时目录”的本质是php的sys_get_temp_dir()返回路径缺乏读写权限或不存在,需通过环境变量、php.ini或docker挂载手动指定可写tmp目录并验证生效。

Composer 报错“无法访问系统临时目录”,本质是它在用 sys_get_temp_dir() 获取路径后,发现当前用户没权限读写该目录,或目录根本不存在。不是 Composer 本身坏了,而是 PHP 运行环境的临时路径配置和实际文件系统权限不匹配。
为什么 sys_get_temp_dir() 返回的路径不可用
PHP 启动时会按顺序检查多个环境变量(TMP、TMPDIR、TEMP)来决定临时目录;都没设才 fallback 到系统默认(如 /tmp 或 C:\Windows\Temp)。但很多共享主机、Docker 容器或权限收紧的 Windows 环境里,这些路径要么被挂载为只读,要么归属不属于当前用户。
常见现象包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux 下报错类似
mkdir(): Permission denied,且ls -ld $(php -r "echo sys_get_temp_dir();")显示属主不是当前用户 - Windows 下提示
failed to open dir,而%TEMP%指向C:\Windows\Temp—— 普通用户无写入权限 - Docker 中
/tmp被映射为 tmpfs 但空间不足,或容器未挂载宿主机临时目录
手动指定 TMP 目录的三种可靠方式
优先级从高到低:运行时环境变量 > php.ini 配置 > 系统默认。改对位置才能生效。
- 在执行
composer install前,直接设置环境变量:TMP=/path/to/writable/tmp composer install(Linux/macOS)set TMP=C:\mytmp && composer install(Windows cmd) - 修改 php.ini,添加或修改:
sys_temp_dir = /path/to/writable/tmp(注意不是upload_tmp_dir) - 如果用 Docker,确保启动时挂载可写目录:
docker run -v $(pwd)/tmp:/tmp:rw ...,并确认容器内用户有权限写入
验证是否真正生效的关键检查点
别只看 Composer 是否跑通——要确认 PHP 层面已切换,否则后续扩展(如 opcache、xdebug 日志)仍可能失败。
- 执行
php -r "echo sys_get_temp_dir().\"\n\";",输出必须是你指定的路径 - 检查该路径是否存在且可读写:
touch $(php -r "echo sys_get_temp_dir();")/test && rm $(php -r "echo sys_get_temp_dir();")/test - 如果用的是 WAMP/XAMPP,注意它们自带的 CLI PHP 和 Apache PHP 可能加载不同 php.ini,得分别检查
最容易被忽略的是:某些 CI 环境(如 GitHub Actions)中,TMP 被设为只读路径,但 sys_get_temp_dir() 仍返回它——此时必须显式覆盖,不能依赖“系统应该自己选对”。










