启用Windows长路径支持并重启系统,即在组策略中启用“启用Win32长路径”或将注册表项LongPathsEnabled设为1,再重启电脑即可解决Composer因MAX_PATH限制导致的安装失败。

Windows下Composer安装失败提示“path too long”怎么办
Windows默认启用的MAX_PATH限制(260字符)会让Composer在嵌套依赖较多时直接报错,典型错误是mkdir(): Invalid argument或failed to open stream: No such file or directory。这不是Composer本身的问题,而是NTFS路径长度策略导致的——它卡在了vendor目录深层嵌套生成阶段。
- 先确认是否真由路径长度触发:运行
composer install -vvv,看报错位置是否出现在类似vendor/composer/installed.json或某深度嵌套包的src/Some/Nested/Directory/Class.php - 不要手动删vendor重试——这治标不治本,下次
composer update还会崩 - 最直接有效的解法是让Windows允许长路径,而非改Composer配置或降级PHP
启用Windows长路径支持(需管理员权限)
从Windows 10周年更新(1607)起,系统已内置长路径开关,但默认关闭。必须通过组策略或注册表启用,否则PHP进程(哪怕用最新版)仍受260字符限制。
- 打开
gpedit.msc→ 计算机配置 → 管理模板 → 系统 → 文件系统 → 启用Win32长路径 → 设为“已启用” - 若用家庭版无组策略编辑器,则改注册表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem→ 将LongPathsEnabled(DWORD)设为1 - 改完必须重启电脑,仅重启终端或PHP服务无效
PHP和Composer版本对长路径的实际影响
即使Windows启用了长路径,旧版PHP(\?\前缀API。
- PHP ≥ 7.4.0 且
enable_dl = Off(默认)时,fopen()、mkdir()等函数才真正尊重长路径开关 - Composer ≥ 2.2.0 内置了路径规范化逻辑,会主动在必要时补
\\?\前缀;低于此版本(如1.x或2.0.x)即使系统开启也大概率失败 - 验证方式:创建一个超长路径测试文件夹(比如50层嵌套),然后在PHP里执行
var_dump(is_dir('\\\\?\\C:\\test\\...'));返回true才算通路
临时绕过方案:修改composer.json降低嵌套深度
如果暂时无法改系统或升级环境(比如共享主机、CI流水线受限),可强制扁平化依赖结构,减少vendor内层级。
- 在
composer.json中添加:{ "config": { "vendor-dir": "vendor", "fxp-asset": { "installer-paths": { "npm-asset-library": "vendor/npm-asset" } } } }(注意:这是旧版fxp插件写法,仅适用于遗留项目) - 更通用的做法是禁用符号链接(Windows对symlink支持不稳定):
composer config --global use-symlinks false - 慎用
composer create-project --no-install再手动删掉部分dev依赖——这容易引发autoload冲突,只建议调试用
file_put_contents(): Failed to open stream,大概率是某个第三方脚本(比如post-install-cmd里的PHP文件)自己做了硬编码路径拼接,没走Composer的IO封装。这种得翻对应包源码,不能只指望系统设置。










