Erreur fatale PHP: appel à la fonction non définie json_decode ()


166

Apache enregistre PHP Fatal error: Call to undefined function json_decode(). Après quelques recherches sur Google, il semble que ce problème soit le résultat de ne pas avoir la dernière version de php. Curieusement, des php --versionsorties en cours d'exécution

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

Montrant clairement que ma phpversion est supérieure à 5.1.

Des idées sur ce qui pourrait causer cela, ou les étapes à suivre pour le découvrir?

EDIT: Le résultat d'un script faisant écho à phpversion est 5.5.1-2+debphp.org~precise

EDIT: Le résultat de phpinfo()est égalementPHP Version 5.5.1-2+debphp.org~precise+2

De plus, dans le phpinfo(), il répertorie le module JSON et les auteurs du module (Omar Kilani, Scott MacVicar).


4
Vérifiez la disable_functionsdirective ini pour voir si elle json_decodeest dans cette liste
Orangepill

Le module json apparaît-il dans votre sortie 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 a un paquet: php-services-json. Peut-être que cela aide ...
jgb

1
@jgb C'est le package PEAR Services_Json. Ce qui est également assez englobant, analyse un peu Javascript, pas seulement JSON. Mais il existe d'autres implémentations de userland qui se réimplémentent directement json_decode.
mario

Réponses:


355

Vous utilisez Ubuntu?

Réponse courte:

sudo apt-get install php7.2-json

(ou php7.1-jsonou php5-jsonselon la version PHP que vous utilisez)

Ensuite, assurez-vous bien sûr de redémarrer Apache :

sudo service apache2 restart

Ou si vous utilisez PHP-FPM:

sudo service php7.2-fpm restart

(Ou php7.1-fpmou php5-fpm)

Explication

Debian a supprimé l'ancienne extension JSON à partir de PHP 5.5rc2 en raison d'un conflit de licence.

La licence JSON a une clause qui stipule:

Le logiciel doit être utilisé pour le bien et non pour le mal.

Cela pose un problème avec la définition du logiciel libre de la Free Software Foundation qui stipule:

La liberté d'exécuter le programme, pour n'importe quel but (liberté 0).

FSF poursuit en répertoriant spécifiquement la licence JSON comme non libre .

Oui, cela semble un peu idiot. Néanmoins Debian a supprimé l'extension JSON non conforme, et a proposé à la place une extension de remplacement fonctionnellement équivalente.

Pour être clair: PHP lui-même n'a PAS supprimé JSON, il est toujours en master . Il s'agit d'un problème de gestionnaire de distribution / package.

Rasmus le dit assez clairement :

Nous n'avons pas supprimé json et nous ne publierons jamais une version de php sans le support intégré de json. Toutes les modifications apportées à la version 5.5 sont dues à l'empaquetage de distribution que vous utilisez sur lequel nous n'avons aucun contrôle.

Plus de détails

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


Je suis revenu pour mentionner qu'il semble que tout 5.5.0va bien JSON, ce n'est que 5.5.1ça casse.
MirroredFate

2
5.5.3 ne l'a pas non plus (Ubuntu 13.10)
Luis Lobo Borobia

9
N'oubliez pas de redémarrer apache après avoir installé le module json avec la commande mentionnée par Chris.
Pavel

1
Si php-json était une dépendance de php-common, tout disparaîtrait ... bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... veuillez voter si cela vous posait un problème.
rickfoosusa

20
Quelqu'un trouve-t-il ironiquement «mal» que cette exclusion de licence logicielle me coûte une heure de recherche?
recursion.ninja

13

Avec Ubuntu:

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

Et apt-get install php7.2-json pour 7.2. J'ai essayé cela mais ne fonctionne toujours pas. Me donner une erreur sur l'application laravel php RuntimeException PHP's json extension is required to use Monolog's NormalizerFormatter
Smit Patel

8

Solution pour les utilisateurs de LAMP:

apt-get install php5-json
service apache2 restart

La source


Si un redémarrage ne résout pas l'erreur, tuez les processus apache2 et démarrez: sudo pkill apache2; service apache2 start
xilef

3

Si vous utilisez phpbrew, essayez d'installer l' extension json pour corriger l'erreur avec la fonction json_decode () non définie :

phpbrew ext install json

2

Le même problème avec 7.1

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

  • Ajoutez json.so au nouveau fichier
  • Ajoutez le lien symbolique approprié sous conf.d
  • Redémarrez le service apache2 (si nécessaire)

2

J'ai la même question PHP Fatal error: Call to undefined function json_decode():, mais je lance php sous cygwin sous Windows. Quand je cours php -m, j'ai trouvé qu'aucun module json n'est installé. Je lance donc à nouveau cygwin setup.exe, vérifie le package json à partir de l'interface de configuration et le problème est résolu.


1

Le module était installé mais le lien symbolique n'était pas dans /etc/php5/cli/conf.d


0

vous pouvez également envisager d'éviter complètement le module PHP principal.

Il est assez courant d'utiliser les outils guzzle json comme bibliothèque dans les applications PHP de nos jours. Si votre application est une application de composition, il est simple de les inclure dans une version de composition. L'outil guzzle, en tant que bibliothèque, serait un remplacement clé en main de l'outil json, si vous dites à PHP d'inclure automatiquement l'outil.

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

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


Le json_decode de Guzzle utilise le json_decode de php avec un contrôle d'erreur supplémentaire, donc votre réponse n'est pas valide
emix

0

CENTOS

Scène

J'ai installé PHP dans Centos Docker, voici mon DockerFile:

FROM centos:7.6.1810

LABEL maintainer="teran.a.joan@gmail.com"

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"]

L'application a renvoyé la même erreur avec json_decode et json_encode

Résolution

Installez PHP Common qui a json_encode et json_decode

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

Comment trouver la résolution?

J'ai un autre fichier Docker qui construit le conteneur pour l'API et il a l'ordre d'installer le client php-mysql:

yum install php72w-mysql.x86_64 -y

Si j'utilise ces images pour monter l'application, le json_encode et le json_decode fonctionnent !! Ok ..... Quelles dépendances cela a-t-il?

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

Oui! À l'intérieur des dépendances se trouvent les packages communs. Je l'ai installé dans mon autre conteneur et ça marche! Après, j'ai mis la directive dans DockerFile, Git commit !! Git Tag !!!! Git Push !!!! Prêt!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.