Error fatal de PHP: Llamada a la función indefinida json_decode ()

165

Apache está iniciando sesión PHP Fatal error: Call to undefined function json_decode(). Después de buscar en Google, parece que este problema es el resultado de no tener la última versión de php. Curiosamente, ejecutando php --versionsalidas

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 mi phpversión es mayor que 5.1.

¿Alguna idea de lo que podría causar esto, o los pasos a seguir para averiguarlo?

EDITAR: El resultado de un script que hace eco de phpversion es 5.5.1-2+debphp.org~precise

EDITAR: El resultado de phpinfo()es tambiénPHP Version 5.5.1-2+debphp.org~precise+2

Además, en el phpinfo(), enumera el módulo JSON y los autores del módulo (Omar Kilani, Scott MacVicar).

Destino Espejado
fuente
44
Compruebe la disable_functionsdirectiva ini para ver si json_decodeestá en esa lista
Orangepill
¿El módulo json aparece en su salida 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 tiene un paquete: php-services-json. Quizás esto ayude ...
jgb
1
@jgb Ese es el paquete PEAR Services_Json. Lo que también es bastante amplio, analiza un poco Javascript, no solo JSON. Pero hay otras implementaciones de usuario que se reimplementan directamente json_decode.
mario

Respuestas:

354

Usando Ubuntu?

Respuesta corta:

sudo apt-get install php7.2-json

(o php7.1-json, o php5-jsondependiendo de la versión de PHP que se está ejecutando)

Luego, por supuesto, asegúrese de reiniciar Apache :

sudo service apache2 restart

O si está utilizando PHP-FPM:

sudo service php7.2-fpm restart

(O php7.1-fpmo php5-fpm)

Explicación

Debian ha eliminado la extensión JSON anterior a partir de PHP 5.5rc2 debido a un conflicto de licencia.

La licencia JSON tiene una cláusula que establece:

El software se utilizará para el bien, no para el mal.

Esto causa un problema con la definición de Free Software Foundation de software libre que establece:

La libertad de ejecutar el programa, para cualquier propósito (libertad 0).

FSF continúa enumerando específicamente la licencia JSON como no libre .

Sí, parece un poco tonto. Sin embargo, Debian ha eliminado la extensión JSON no compatible y, en su lugar, ofreció una extensión de reemplazo que es funcionalmente equivalente.

Para ser claros: PHP en sí NO ha eliminado JSON, todavía está en master . Este es un problema de distribución / administrador de paquetes.

Rasmus lo deja bastante claro :

No hemos eliminado json y nunca lanzaremos una versión de php sin el soporte de json incorporado. Cualquier cambio en 5.5 se debe a cualquier paquete de distribución que esté utilizando sobre el que no tenemos control.

Más detalles

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
fuente
Volví a mencionar que parece que 5.5.0está bien JSON, es solo 5.5.1que se rompe.
MirroredFate
2
5.5.3 tampoco lo tiene (Ubuntu 13.10)
Luis Lobo Borobia
9
No olvide reiniciar apache después de instalar el módulo json con el comando que mencionó Chris.
Pavel
1
Si php-json fuera una dependencia de php-common, todo esto desaparecería ... bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... vote si esto fue un problema para usted.
rickfoosusa
20
¿Alguien encuentra irónicamente "malvado" que esta exclusión de licencias de software me haya costado una hora de tiempo de investigación?
recursion.ninja
13

Con Ubuntu:

sudo apt-get install php5-json
sudo service php5-fpm restart
David
fuente
¿Qué pasa apt-get install php7.2-json con 7.2. Intenté esto pero aún no funciona. Dándome un error en la aplicación laravel php RuntimeException PHP's json extension is required to use Monolog's NormalizerFormatter
Smit Patel
8

Solución para usuarios de LAMP:

apt-get install php5-json
service apache2 restart

Fuente

milkovsky
fuente
Si un reinicio no resuelve el error, elimine los procesos de apache2 y comience: sudo pkill apache2; inicio del servicio apache2
xilef
3

Si está utilizando phpbrew, intente instalar la extensión json para corregir el error con la función indefinida json_decode () :

phpbrew ext install json
yesnik
fuente
2

El mismo problema con 7.1

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

  • Agregue json.so al nuevo archivo
  • Agregue el enlace sym apropiado en conf.d
  • Reinicie el servicio apache2 (si es necesario)
Carl Hinton
fuente
2

Tengo la misma pregunta: PHP Fatal error: Call to undefined function json_decode()pero ejecuto php bajo cygwin en Windows. Cuando ejecuto php -m, descubrí que no hay un módulo json instalado. Entonces ejecuto cygwin setup.exe nuevamente, verifico el paquete json desde la interfaz de configuración y el problema está resuelto.

Rafy
fuente
1

El módulo se instaló pero el enlace simbólico no estaba en /etc/php5/cli/conf.d

NicoMinsk
fuente
0

También puede considerar evitar el módulo PHP central por completo.

Es bastante común usar las herramientas guzzle json como una biblioteca en aplicaciones PHP en estos días. Si su aplicación es una aplicación de compositor, es trivial incluirlos como parte de una compilación de compositor. La herramienta guzzle, como biblioteca, sería un reemplazo llave en mano para la herramienta json, si le dice a PHP que incluya automáticamente la herramienta.

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

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

jaxxed
fuente
El json_decode de Guzzle está usando el json_decode de php con verificación de error adicional, por lo que su respuesta no es válida
emix
0

CENTOS

Escena

Instalé PHP en Centos Docker, este es mi 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"]

La aplicación devolvió el mismo error con json_decode y json_encode

Resolución

Instale PHP Common que tiene json_encode y json_decode

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

¿Cómo encontrar la resolución?

Tengo otro archivo Docker que construye el contenedor para la API y tiene el orden de instalar el cliente php-mysql:

yum install php72w-mysql.x86_64 -y

Si uso estas imágenes para montar la aplicación, ¡json_encode y json_decode funcionan! Ok ..... ¿Qué dependencias tiene esto?

[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!

¡Si! Dentro de las dependencias se encuentran los paquetes comunes. ¡Lo instalé en mi otro contenedor y funciona! Después, puse la directiva en DockerFile, Git commit !! Git Tag !!!! Git Push !!!! ¡Listo!

Joan Teran
fuente