Erro fatal do PHP: Chamada para a função indefinida json_decode ()

165

O Apache está registrando PHP Fatal error: Call to undefined function json_decode(). Depois de pesquisar no Google, parece que esse problema é resultado de não ter a versão mais recente do php. Estranhamente, executando php --versionsaídas

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

Mostrando claramente que minha phpversão é maior que 5.1.

Alguma idéia do que poderia causar isso ou as etapas a serem seguidas para descobrir?

EDIT: O resultado de um script ecoando phpversion é 5.5.1-2+debphp.org~precise

EDIT: O resultado de phpinfo()também éPHP Version 5.5.1-2+debphp.org~precise+2

Além disso, no phpinfo(), lista o módulo JSON e os autores do módulo (Omar Kilani, Scott MacVicar).

MirroredFate
fonte
4
Verifique a disable_functionsdirectiva ini para ver se json_decodeestá nessa lista
Orangepill
O módulo json aparece na sua saída phpinfo ()?
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 tem um pacote: php-services-json. Talvez isso ajude ...
JGB
1
@jgb Esse é o pacote PEAR Services_Json. O que também é bastante abrangente, analisa um pouco o Javascript, e não apenas o JSON. Mas existem outras implementações de terra de usuário que reimplementam diretamente json_decode.
mario

Respostas:

354

Usando o Ubuntu?

Resposta curta:

sudo apt-get install php7.2-json

(ou php7.1-jsonou php5-jsondependendo da versão do PHP que você está executando)

Então, é claro, certifique-se de reiniciar o Apache :

sudo service apache2 restart

Ou se você estiver usando PHP-FPM:

sudo service php7.2-fpm restart

(Or php7.1-fpmor php5-fpm)

Explicação

O Debian removeu a extensão JSON anterior a partir do PHP 5.5rc2 devido a um conflito de licença.

A licença JSON possui uma cláusula que afirma:

O Software deve ser usado para o Bem, não para o Mal.

Isso causa um problema com a definição de software livre da Free Software Foundation que declara:

A liberdade de executar o programa, para qualquer finalidade (liberdade 0).

A FSF continua listando especificamente a licença JSON como não livre .

Sim, parece um pouco bobo. No entanto, o Debian removeu a extensão JSON não compatível e, em vez disso, ofereceu uma extensão de substituição que é funcionalmente equivalente.

Para ser claro: o próprio PHP NÃO removeu o JSON, ainda está no master . Este é um problema de distribuição / gerenciamento de pacotes.

Rasmus deixa bem claro :

Nós não removemos o json e nunca lançaremos uma versão do php sem o suporte ao json incorporado. Quaisquer alterações no 5.5 são devidas a qualquer pacote de distribuição que você esteja usando e sobre o qual não tenhamos controle.

Mais detalhes

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

jszobody
fonte
Voltei a mencionar que parece que 5.5.0está tudo bem JSON, é só 5.5.1isso que quebra.
MirroredFate
2
5.5.3 não tem nem (Ubuntu 13.10)
Luis Lobo Borobia
9
Não esqueça de reiniciar o apache após instalar o módulo json com o comando mencionado por Chris.
Pavel
1
Se o php-json fosse uma dependência do php-common, tudo isso desapareceria ... bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... vote se isso foi um problema para você.
Rickfoosusa
20
Alguém acha ironicamente "mau" que essa exclusão de licenciamento de software me custe uma hora de tempo de pesquisa?
Recursion.ninja
13

Com o Ubuntu:

sudo apt-get install php5-json
sudo service php5-fpm restart
David
fonte
E quanto apt-get install php7.2-json ao 7.2. Eu tentei isso, mas ainda não está funcionando. Dando-me erro no aplicativo laravel php RuntimeException PHP's json extension is required to use Monolog's NormalizerFormatter
Smit Patel
8

Solução para usuários LAMP:

apt-get install php5-json
service apache2 restart

Fonte

milkovsky
fonte
Se uma reinicialização falhar na solução do erro, mate os processos apache2 e inicie: sudo pkill apache2; serviço apache2 start
xilef 24/10
3

Se você estiver usando o phpbrew, tente instalar a extensão json para corrigir erros com a função indefinida json_decode () :

phpbrew ext install json
yesnik
fonte
2

O mesmo problema com o 7.1

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

  • Adicione json.so ao novo arquivo
  • Adicione o link sym apropriado em conf.d
  • Reinicie o serviço apache2 (se necessário)
Carl Hinton
fonte
2

Eu tenho a mesma pergunta PHP Fatal error: Call to undefined function json_decode():, mas eu corro o php sob o cygwin no Windows. Quando executo php -m, descobri que não há nenhum módulo json instalado. Então, eu executo o cygwin setup.exe novamente, verifique o pacote json na interface de configuração e o problema foi resolvido.

Rafy
fonte
1

O módulo foi instalado, mas o link simbólico não estava em /etc/php5/cli/conf.d

NicoMinsk
fonte
0

você também pode evitar completamente o módulo PHP principal.

É bastante comum usar as ferramentas guzzle json como uma biblioteca em aplicativos PHP atualmente. Se o seu aplicativo for um compositor, é trivial incluí-lo como parte de uma compilação do compositor. A ferramenta guzzle, como uma biblioteca, seria uma substituição turnkey para a ferramenta json, se você disser ao PHP para incluir automaticamente a ferramenta.

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

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

jaxxed
fonte
O json_decode do Guzzle está usando o json_decode do php com verificação de erro adicional, portanto sua resposta é inválida
emix
0

CENTOS

Cena

Eu instalei o PHP no Centos Docker, este é o meu DockerFile:

FROM centos:7.6.1810

LABEL maintainer="[email protected]"

RUN yum install httpd-2.4.6-88.el7.centos -y
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
RUN yum install php72w -y
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

O aplicativo retornou o mesmo erro com json_decode e json_encode

Resolução

Instale o PHP Common que possui json_encode e json_decode

yum install -y php72w-common-7.2.14-1.w7.x86_64

Como encontrar a resolução?

Eu tenho outro arquivo Docker que constrói o contêiner para a API e ele tem a ordem para instalar o cliente php-mysql:

yum install php72w-mysql.x86_64 -y

Se eu usar essas imagens para montar o aplicativo, o json_encode e o json_decode funcionam !! Ok ..... Que dependências isso tem?

[root@c023b46b720c etc]# yum install php72w-mysql.x86_64
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirror.gtdinternet.com
 * epel: mirror.globo.com
 * extras: linorg.usp.br
 * updates: mirror.gtdinternet.com
 * webtatic: us-east.repo.webtatic.com
Resolving Dependencies
--> Running transaction check
---> Package php72w-mysql.x86_64 0:7.2.14-1.w7 will be installed
--> Processing Dependency: php72w-pdo(x86-64) for package: php72w-mysql-7.2.14-1.w7.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: php72w-mysql-7.2.14-1.w7.x86_64
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: php72w-mysql-7.2.14-1.w7.x86_64
--> Running transaction check
---> Package mariadb-libs.x86_64 1:5.5.60-1.el7_5 will be installed
---> Package php72w-pdo.x86_64 0:7.2.14-1.w7 will be installed
--> Processing Dependency: php72w-common(x86-64) = 7.2.14-1.w7 for package: php72w-pdo-7.2.14-1.w7.x86_64
--> Running transaction check
---> Package php72w-common.x86_64 0:7.2.14-1.w7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================
 Package                   Arch               Version                        Repository            Size
========================================================================================================
Installing:
 php72w-mysql              x86_64             7.2.14-1.w7                    webtatic              82 k
Installing for dependencies:
 mariadb-libs              x86_64             1:5.5.60-1.el7_5               base                 758 k
 php72w-common             x86_64             7.2.14-1.w7                    webtatic             1.3 M
 php72w-pdo                x86_64             7.2.14-1.w7                    webtatic              89 k

Transaction Summary
========================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 2.2 M
Installed size: 17 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): mariadb-libs-5.5.60-1.el7_5.x86_64.rpm                                    | 758 kB  00:00:00     
(2/4): php72w-mysql-7.2.14-1.w7.x86_64.rpm                                       |  82 kB  00:00:01     
(3/4): php72w-pdo-7.2.14-1.w7.x86_64.rpm                                         |  89 kB  00:00:01     
(4/4): php72w-common-7.2.14-1.w7.x86_64.rpm                                      | 1.3 MB  00:00:06     
--------------------------------------------------------------------------------------------------------
Total                                                                   336 kB/s | 2.2 MB  00:00:06     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 1:mariadb-libs-5.5.60-1.el7_5.x86_64                                                 1/4 
  Installing : php72w-common-7.2.14-1.w7.x86_64                                                     2/4 
  Installing : php72w-pdo-7.2.14-1.w7.x86_64                                                        3/4 
  Installing : php72w-mysql-7.2.14-1.w7.x86_64                                                      4/4 
  Verifying  : php72w-common-7.2.14-1.w7.x86_64                                                     1/4 
  Verifying  : 1:mariadb-libs-5.5.60-1.el7_5.x86_64                                                 2/4 
  Verifying  : php72w-pdo-7.2.14-1.w7.x86_64                                                        3/4 
  Verifying  : php72w-mysql-7.2.14-1.w7.x86_64                                                      4/4 

Installed:
  php72w-mysql.x86_64 0:7.2.14-1.w7                                                                     

Dependency Installed:
  mariadb-libs.x86_64 1:5.5.60-1.el7_5                php72w-common.x86_64 0:7.2.14-1.w7               
  php72w-pdo.x86_64 0:7.2.14-1.w7                    

Complete!

Sim! Dentro das dependências estão os pacotes comuns. Eu instalei no meu outro contêiner e funciona! Depois, coloquei a diretiva no DockerFile, Git commit !! Git Tag !!!! Git Push !!!! Pronto!

Joan Teran
fonte