Errore irreversibile PHP: chiamata alla funzione indefinita json_decode ()


165

Apache sta registrando PHP Fatal error: Call to undefined function json_decode(). Dopo alcuni googling, sembra che questo problema sia dovuto al fatto di non avere l'ultima versione di php. Stranamente, eseguendo le php --versionuscite

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

Dimostrando chiaramente che la mia phpversione è maggiore di 5.1.

Qualche idea su cosa potrebbe causare questo o sui passi da compiere per scoprirlo?

EDIT: Il risultato di una sceneggiatura che fa eco a phpversion è 5.5.1-2+debphp.org~precise

EDIT: Il risultato di phpinfo()è anchePHP Version 5.5.1-2+debphp.org~precise+2

Inoltre, nel phpinfo(), elenca il modulo JSON e gli autori del modulo (Omar Kilani, Scott MacVicar).


4
Controlla la disable_functionsdirettiva ini per vedere se json_decodeè in quella lista
Orangepill

Il modulo json viene visualizzato nell'output 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 ha un pacchetto: php-services-json. Forse questo aiuta ...
jgb

1
@jgb Questo è il pacchetto PEAR Services_Json. Anche questo è abbastanza completo, analizza un po 'Javascript, non solo JSON. Ma ci sono altre implementazioni di userland che si reimplementano direttamente json_decode.
Mario,

Risposte:


354

Usi Ubuntu?

Risposta breve:

sudo apt-get install php7.2-json

(o php7.1-json oppure php5-jsona seconda della versione di PHP è in esecuzione)

Quindi ovviamente assicurati di riavviare Apache :

sudo service apache2 restart

O se stai usando PHP-FPM:

sudo service php7.2-fpm restart

(O php7.1-fpm oppure php5-fpm)

Spiegazione

Debian ha rimosso la precedente estensione JSON a partire da PHP 5.5rc2 a causa di un conflitto di licenza.

La licenza JSON ha una clausola che afferma:

Il software deve essere usato per il bene, non per il male.

Ciò causa un problema con la definizione di software libero della Free Software Foundation che afferma:

La libertà di eseguire il programma, per qualsiasi scopo (libertà 0).

FSF prosegue elencando specificamente la licenza JSON come non libera .

Sì, sembra un po 'sciocco. Tuttavia Debian ha rimosso l'estensione JSON non conforme e invece ha offerto un'estensione sostitutiva funzionalmente equivalente.

Per essere chiari: PHP stesso NON ha rimosso JSON, è ancora nel master . Questo è un problema di distro / gestore pacchetti.

Rasmus lo rende abbastanza chiaro :

Non abbiamo rimosso json e non rilasceremo mai una versione di php senza il supporto json incorporato. Eventuali modifiche alla versione 5.5 sono dovute a qualsiasi pacchetto di distribuzione che stai utilizzando e su cui non abbiamo alcun controllo.

Più dettagli

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


Sono tornato per menzionare che sembra che vada 5.5.0bene JSON, è solo 5.5.1che si rompe.
MirroredFate

2
5.5.3 non ce l'ha nemmeno (Ubuntu 13.10)
Luis Lobo Borobia il

9
Non dimenticare di riavviare apache dopo aver installato il modulo json con il comando menzionato da Chris.
Pavel,

1
Se php-json fosse una dipendenza di php-common, tutto ciò sparirebbe ... bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... per favore, vota se questo fosse un problema per te.
rickfoosusa,

20
Qualcuno trova ironicamente "malvagio" che questa esclusione delle licenze software mi sia costata un'ora di tempo per la ricerca?
recursion.ninja,

13

Con Ubuntu:

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

Che dire apt-get install php7.2-json di 7.2. Ho provato questo, ma ancora non funziona. Mi dà un errore sull'app Laravel php RuntimeException PHP's json extension is required to use Monolog's NormalizerFormatter
Smit Patel,

8

Soluzione per utenti LAMP:

apt-get install php5-json
service apache2 restart

fonte


Se un riavvio non riesce a risolvere l'errore, interrompere i processi apache2 e avviare: sudo pkill apache2; servizio apache2 inizio
xilef

3

Se stai usando phpbrew prova a installare l' estensione json per correggere l'errore con la funzione indefinita json_decode () :

phpbrew ext install json

2

Lo stesso problema con 7.1

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

  • Aggiungi json.so al nuovo file
  • Aggiungi il link sym appropriato sotto conf.d
  • Riavvia il servizio apache2 (se necessario)

2

Ho la stessa domanda PHP Fatal error: Call to undefined function json_decode():, ma eseguo php con Cygwin su Windows. Quando corro php -m, ho scoperto che non è installato alcun modulo json. Quindi eseguo nuovamente cygwin setup.exe, controllo il pacchetto json dall'interfaccia di configurazione e il problema è risolto.


1

Il modulo è stato installato ma il collegamento simbolico non era in /etc/php5/cli/conf.d


0

potresti anche considerare di evitare del tutto il modulo PHP principale.

Al giorno d'oggi è abbastanza comune usare gli strumenti jog di guzzle come libreria nelle app PHP. Se la tua app è un'app compositore, è banale includerli come parte di una build del compositore. Lo strumento guzzle, come libreria, sarebbe una sostituzione chiavi in ​​mano per lo strumento json, se dici a PHP di includere automaticamente lo strumento.

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

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


Il codice json_decode di Guzzle sta utilizzando il codice json_dec di php con ulteriore controllo degli errori, quindi la tua risposta non è valida
emix

0

CENTOS

Scena

Ho installato PHP in Centos Docker, questo è il mio 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'app ha restituito lo stesso errore con json_decode e json_encode

Risoluzione

Installa PHP Common con json_encode e json_decode

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

Come trovare la risoluzione?

Ho un altro file Docker che crea il contenitore per l'API e ha l'ordine di installare il client php-mysql:

yum install php72w-mysql.x86_64 -y

Se uso queste immagini per montare l'app, json_encode e json_decode funzionano !! Ok ..... Quali dipendenze ha questo?

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

Sì! All'interno delle dipendenze si trovano i pacchetti comuni. L'ho installato nell'altro mio contenitore e funziona! Dopo, ho inserito la direttiva in DockerFile, Git commit !! Git Tag !!!! Git Push !!!! Pronto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.