该错误通常由 composer.lock 或 vendor/composer/installed.json 文件损坏引起,如 json 格式错误、bom 头、unicode 转义不全、权限不足导致写入截断等;应优先用 jq 或 python3 -m json.tool 验证 json 合法性,删除损坏文件后重装。
Composer install 报错 UnexpectedValueException: Invalid argument supplied for foreach()
这个错误通常不是代码问题,而是 composer.lock 或 vendor/composer/installed.json 文件损坏导致的。Composer 在解析这些 JSON 文件时遇到格式错误(比如末尾多逗号、缺少引号、Unicode 转义不全、BOM 头),就会抛出 UnexpectedValueException,且错误信息往往不指明具体哪一行——这是最让人头疼的地方。
- 优先检查
composer.lock:用 VS Code 或 Sublime 打开,开启「显示不可见字符」,看是否有 BOM(EF BB BF开头)、换行符异常(\r\n混用)、或编辑器自动插入的零宽空格 - 用命令行验证 JSON 合法性:
php -l composer.lock不起作用(PHP 不校验 JSON),应改用:jq empty composer.lock(需安装jq)或python3 -m json.tool composer.lock > /dev/null - 如果报错指向
vendor/composer/installed.json,不要手动编辑它——它是 Composer 自动写入的,直接删掉vendor/和composer.lock,再运行composer install
JSON 中中文路径或包名导致解析失败
某些 Windows 环境下,Composer 会把含中文的 vendor 路径或包描述写进 installed.json,但未正确转义 Unicode 字符(例如写成 张三 而非 \u5f20\u4e09),PHP 的 json_decode() 默认拒绝这种非标准格式,直接 throw UnexpectedValueException。