PHP致命错误:调用未定义的函数json_decode()。

182

Apache记录了PHP致命错误:调用未定义的函数json_decode()。经过一些谷歌搜索,似乎这个问题是由于没有安装最新版本的php引起的。奇怪的是,运行php --version会输出以下结果:

PHP 5.5.1-2+debphp.org~precise+2 (cli) (built: Aug  6 2013 10:49:43) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.2-dev, Copyright (c) 1999-2013, by Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

明确显示我的PHP版本大于5.1

有什么想法可以导致这个问题,或者需要采取哪些步骤来找出原因?

编辑:脚本回显phpversion的结果是5.5.1-2+debphp.org~precise

编辑:phpinfo()的结果也是PHP Version 5.5.1-2+debphp.org~precise+2

此外,在phpinfo()中,列出了JSON模块和模块作者(Omar Kilani、Scott MacVicar)。


4
请检查 disable_functions 配置指令,看看是否将 json_decode 列入其中。 - Orangepill
你的phpinfo()输出中是否显示了json模块? - tcmitche
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_ge\ t_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, - MirroredFate
Ubuntu 12.04有一个叫做php-services-json的软件包。也许这可以帮到你... - jgb
1
@jgb 这是PEAR包Services_Json。它也非常全面,可以解析一些JavaScript,而不仅仅是JSON。但是还有其他用户空间实现直接重新实现json_decode - mario
11个回答

368

使用Ubuntu操作系统?

简明回答:

sudo apt-get install php7.2-json

(或者根据您使用的PHP版本,是php7.1-json还是php5-json)

然后当然确保您重新启动Apache:

sudo service apache2 restart

或者如果您正在使用PHP-FPM:

sudo service php7.2-fpm restart

(或 php7.1-fpmphp5-fpm)

说明

Debian自PHP 5.5rc2起因为许可证冲突已删除了以前的JSON扩展。

JSON许可证有一个条款规定:

软件应用于善良, 而非邪恶。

这导致了自由软件基金会关于自由软件的定义存在问题,其中规定:

运行程序的自由,无论任何目的(自由0)。

FSF继续特别将JSON许可证列为不自由的

是的,这似乎有点荒谬。尽管如此,Debian已经删除了不符合标准的JSON扩展,并提供了一个功能上等效的替代扩展

明确一下: PHP本身并没有删除JSON,它仍然在主分支中。这是一个发行版/软件包管理器的问题。

Rasmus很明确地表示:

我们没有删除JSON,也永远不会发布一个没有内置json支持的php版本。任何在5.5中的改变都归因于您所使用的发行版打包,而这是我们无法控制的。

更多细节

http://iteration99.com/2013/php-json-licensing-and-php-5-5/

http://liorkaplan.wordpress.com/2013/06/01/bye-bye-non-free-php-json-extension/

https://bugs.php.net/bug.php?id=63520

http://philsturgeon.co.uk/blog/2013/08/fud-cracker-php-55-never-lost-json-support


2
5.5.3在Ubuntu 13.10中也没有它。 - Luis Lobo Borobia
9
在执行 Chris 提到的命令安装 JSON 模块后,不要忘记重新启动 Apache。 - Pavel
1
如果php-json是php-common的依赖项,所有问题都将消失...https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... 如果您也遇到了此问题,请投票支持。 - rickfoosusa
你是否曾经想过是谁定义了这里的“邪恶”?而你使用的软件可能允许或不允许你使用它?我不会这样做。 - Jürgen A. Erhard
22
有人觉得讽刺的是,这个软件许可证排除条款让我浪费了一小时的研究时间,感觉很“邪恶”吗? - recursion.ninja
显示剩余4条评论

13

使用Ubuntu:

sudo apt-get install php5-json
sudo service php5-fpm restart

1
对于7.2版本,apt-get install php7.2-json怎么样?我尝试了这个方法,但仍然无法正常工作。在Laravel应用程序上给了我一个错误。RuntimeException 需要PHP的json扩展来使用Monolog的NormalizerFormatter - Smit Patel

10
作为一名RHEL 8用户,解决方法如下:
yum install php-json

然后重新加载nginx和php-fpm。基本上,json库在默认的php安装中缺失。

这也适用于CENTOS 8。


8

LAMP用户的解决方案:

apt-get install php5-json
service apache2 restart

Source:


如果重启无法解决错误,请终止apache2进程并启动:sudo pkill apache2; service apache2 start - xilef

4
如果您正在使用 phpbrew ,请尝试安装 json 扩展来解决与 undefined function json_decode() 的错误。
phpbrew ext install json

2

7.1版本也存在同样的问题

apt-get install php7.1-json sudo nano /etc/php/7.1/mods-available/json.ini

  • 在新文件中添加json.so
  • 在conf.d下添加相应的符号链接
  • 重新启动apache2服务(如果需要)

2

我有同样的问题:PHP致命错误:调用未定义的函数json_decode(),但我在Windows下使用cygwin运行php。当我运行php -m时,我发现没有安装json模块。因此,我再次运行cygwin setup.exe,在配置界面中勾选json包,问题得到解决。


从命令行安装:apt-cyg install php-json -- 有关安装apt-cyg的详细信息,请参见https://dev59.com/_VcO5IYBdhLWcg3wvUMp - Orwellophile

1
模块已安装,但符号链接未在/etc/php5/cli/conf.d中。

0

cPanel

前往MultiPHP INI Editor并选择编辑模式选项卡,输入以下内容以启用JSON扩展:

extension=json.so

或者,如果您在根目录中有现有的php.ini文件,请检查是否列出了此扩展名,并确保它没有被注释掉(前面带有分号)。


0

你可能也考虑完全避免使用核心的PHP模块。

现在在PHP应用程序中使用guzzle json工具作为库非常普遍。如果你的应用程序是一个composer应用程序,将它们作为composer构建的一部分包含进去是微不足道的。 作为库的guzzle工具可以成为json工具的即插即用替代品,只要告诉PHP自动包含该工具即可。

http://docs.guzzlephp.org/en/stable/search.html?q=json_encode#

http://apigen.juzna.cz/doc/guzzle/guzzle/function-GuzzleHttp.json_decode.html


Guzzle的json_decode使用了php的json_decode并添加了额外的错误检查,所以你的答案无效。 - Mike Doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接