答案是ext-json未在PHP CLI环境中启用:Web和CLI使用独立配置,需用php -m | grep json验证CLI是否加载,再查php --ini定位php.ini路径并确认extension=json行存在且未注释。

不是 Composer 缺少 json 扩展,而是你当前 PHP CLI 环境没加载 ext-json —— 这个扩展必须启用,否则 json_decode、json_encode 等函数在命令行下直接不可用,Composer install 会卡死或报错。
为什么 composer install 明明提示 “ext-json is missing”,但 php -v 和网站却正常?
因为 Web SAPI(如 nginx + php-fpm)和 CLI SAPI 是两套独立的 PHP 配置。你浏览器能跑 JSON 功能,只说明 php-fpm 加载了 ext-json;而 composer install 走的是 CLI 模式,它读的是 CLI 专用的 php.ini。常见情况包括:
- 系统装了多个 PHP 版本,CLI 默认用的是未启用 json 的那个(比如
php8.0-cli而不是php8.2-fpm) - CLI 的
php.ini里压根没写extension=json(Linux/macOS)或extension=php_json.dll(Windows) - 某些 Docker Alpine 镜像默认不带 json 扩展,即使 PHP 本身编译时支持,也得显式
docker-php-ext-enable json
快速确认 CLI 是否真缺 ext-json
别猜,直接执行三步验证:
- 运行
php -m | grep json—— 如果没输出,就是 CLI 确实没加载 - 运行
php -i | grep "Loaded Configuration File"—— 看 CLI 实际读哪个php.ini - 打开上一步查到的
php.ini,搜json,确认是否有extension=json行且未被注释
如果该 ini 文件里没有这行,手动加进去;如果是 Ubuntu/Debian,更稳妥的方式是安装包:sudo apt install php-json(自动写入并启用)。
composer.json 里要不要加 "ext-json": "*"?
要,但目的不是“让 Composer 安装 json”,而是明确声明项目依赖 —— 尤其当你的代码大量使用 json_decode、json_encode 或依赖 Symfony/ Laravel 等框架时。加法如下:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
"require": {
"php": "^8.1",
"ext-json": "*"
}
注意两点:
- 加了之后,
composer install会在执行前强制校验 CLI 环境是否满足,提前暴露问题,而不是等到 runtime 报错 - PHPStorm 等 IDE 的警告(如 “ext-json is missing in composer.json”)也会消失,前提是关闭了 Inspection 中的 “Require PHP Bundled Extensions” 选项,否则它会把内置扩展也当成可选依赖来报
CentOS 上装完 php-json 还是不行?检查 SELinux 和扩展路径
CentOS 7/8 常见陷阱:
-
yum install php-json安装后,扩展文件可能放在/usr/lib64/php/modules/json.so,但php.ini里写的却是extension=json.so—— 如果模块路径不在extension_dir列表里,PHP 会静默忽略 - SELinux 可能阻止 PHP 加载模块:临时测试可运行
setenforce 0,若此时php -m | grep json出来了,就得调整上下文或策略 - 部分旧版 CentOS 的 php-json 包名是
php-common的子模块,直接yum install php-common反而更可靠
最简验证法:php -d extension=json.so -m | grep json —— 如果这条能出结果,说明模块本身可用,问题纯属配置路径或权限。
真正容易被忽略的是:有些 CI/CD 流水线用的是精简版 PHP 镜像(比如 php:8.2-cli-alpine),它默认不包含 json 扩展,哪怕 PHP 8.2 本身内置了 JSON 功能,Alpine 仍需显式 apk add php82-json 并 docker-php-ext-enable json —— 不做这步,composer install 必然失败,且错误信息极其简短,就一行 “ext-json is missing”。

















