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.