php 8.0+ 报错 call to undefined function json_encode() 主因是 disable_functions 配置禁用了该函数,而非 json 扩展缺失;需检查 php.ini 中 disable_functions 是否包含 json_encode/json_decode,确认 cli 与 web 使用相同配置,并重启 php-fpm。
php 8.0+ 报错 call to undefined function json_encode()
这基本不是真的“缺少 json 扩展”,而是扩展没启用,或被显式禁用。php 8.0 起,json 扩展已从“可选”变为“强制内置”,不再支持编译时关闭——所以你看到这个错误,大概率是运行时配置问题。
实操建议:
- 检查
php.ini中是否写了extension=json(PHP 8.0+ 不需要这行,加了反而可能报错) - 确认没有在
php.ini或某处用了disable_functions = json_encode,json_decode—— 这是最常被忽略的“假缺失”原因 - 运行
php -m | grep json,如果无输出,说明模块未加载;若有输出但 Web 环境仍报错,说明 CLI 和 FPM/Apache 使用了不同php.ini
Apache/Nginx 下 PHP-FPM 加载了错误的 php.ini
Web 请求和命令行看到的扩展列表不一致,几乎全是这个原因。PHP-FPM 默认不读取系统级 /etc/php/*/cli/php.ini,而是读 /etc/php/*/fpm/php.ini(路径依发行版而异)。
实操建议:
- 在 Web 页面中调用
phpinfo(),搜索 “Loaded Configuration File”,看实际生效的是哪个php.ini - 检查该文件里是否有
disable_functions包含json_encode;有就删掉或注释掉整行 - 改完后必须重启 PHP-FPM:比如
sudo systemctl restart php8.2-fpm(版本号按实际替换)
Alpine Linux + Docker 环境下 json 扩展未启用
Alpine 的 php8 包默认不带 json 扩展,即使 PHP 8 是新版本,也得手动装。这不是 bug,是 Alpine 的精简策略。
实操建议:
- Dockerfile 中不能只写
apk add php8,必须加php8-json:apk add php8 php8-json - 验证方式:容器内执行
php -r "echo json_encode(['ok']);",不报错才算成功 - 注意 Alpine 的 PHP 包名带版本号(如
php82-json),别按 Debian 习惯写成php-json
Composer 自动加载触发 json_* 函数失败
某些老项目在 composer autoload 阶段就调用 json_decode()(比如解析 composer.json 元数据),此时若 disable_functions 已生效,会直接中断 autoload,导致后续任何类都加载不了——错误看起来像“找不到类”,实则是底层函数被锁死。
实操建议:
- 临时绕过:用
php -d disable_functions= composer install测试是否为该问题 - 根本解法:在对应环境的
php.ini中彻底移除json_encode和json_decode(哪怕其他函数还保留) - 别指望
ini_set('disable_functions', '')—— 这个指令在运行时无效,仅限 php.ini 静态配置
真正麻烦的从来不是扩展装没装上,而是 disable_functions 这种“隐形开关”藏在某个层级的配置里,且不会报“扩展未加载”,只报“函数不存在”。查的时候得一层层比对 php --ini、phpinfo()、php -m 输出的差异,而不是直接重装 PHP。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










