Błąd krytyczny PHP: wywołanie niezdefiniowanej funkcji json_decode ()

165

Apache rejestruje PHP Fatal error: Call to undefined function json_decode(). Po pewnym googlowaniu wydaje się, że ten problem jest spowodowany brakiem najnowszej wersji php. Dziwne, uruchomione php --versionouputs

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

Wyraźnie pokazując, że moja phpwersja jest większa niż 5.1.

Jakieś pomysły, co może to spowodować lub kroki, które należy podjąć, aby się tego dowiedzieć?

EDYCJA: Wynik skryptu odzwierciedlającego wersję php to 5.5.1-2+debphp.org~precise

EDYCJA: Wynik phpinfo()jest równieżPHP Version 5.5.1-2+debphp.org~precise+2

Ponadto, w phpinfo(), zawiera listę modułu JSON i autorów modułu (Omar Kilani, Scott MacVicar).

MirroredFate
źródło
4
Sprawdź disable_functionsdyrektywę ini, aby zobaczyć, czy json_decodeznajduje się na tej liście
Orangepill
Czy moduł json pojawia się na wyjściu 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 ma pakiet: php-services-json. Może to pomoże ...
jgb
1
@jgb To jest pakiet PEAR Services_Json. Co jest również dość obszerne, analizuje trochę JavaScript, a nie tylko JSON. Ale są też inne implementacje w przestrzeni użytkownika, które są bezpośrednio ponownie wdrażane json_decode.
mario

Odpowiedzi:

354

Korzystasz z Ubuntu?

Krótka odpowiedź:

sudo apt-get install php7.2-json

(lub php7.1-jsonlub w php5-jsonzależności od używanej wersji PHP)

Następnie oczywiście upewnij się, że ponownie uruchomiłeś Apache :

sudo service apache2 restart

Lub jeśli używasz PHP-FPM:

sudo service php7.2-fpm restart

(Lub php7.1-fpmlub php5-fpm)

Wyjaśnienie

Debian usunął poprzednie rozszerzenie JSON z PHP 5.5rc2 z powodu konfliktu licencji.

Licencja JSON zawiera klauzulę, która stwierdza:

Oprogramowanie ma służyć dobru, a nie złowi.

Powoduje to problem z definicją wolnego oprogramowania według Free Software Foundation :

Wolność uruchamiania programu w dowolnym celu (wolność 0).

FSF szczegółowo wymienia licencję JSON jako niewolną .

Tak, wydaje się to trochę głupie. Niemniej jednak Debian usunął niezgodne rozszerzenie JSON i zamiast tego zaoferował zastępcze rozszerzenie, które jest funkcjonalnie równoważne.

Dla jasności: samo PHP NIE usunęło JSON, nadal jest w master . To jest problem dystrybucji / menedżera pakietów.

Rasmus wyjaśnia to całkiem jasno :

Nie usunęliśmy json i nigdy nie wypuścimy wersji php bez wbudowanej obsługi json. Wszelkie zmiany w 5.5 wynikają z dowolnego pakietu dystrybucji, którego używasz, nad którym nie mamy kontroli.

Więcej szczegółów

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
źródło
Wróciłem, aby wspomnieć, że wydaje się, że 5.5.0jest w porządku JSON, to tylko się 5.5.1psuje.
MirroredFate
2
5.5.3 też go nie ma (Ubuntu 13.10)
Luis Lobo Borobia
9
Nie zapomnij zrestartować Apache po zainstalowaniu modułu json za pomocą polecenia, o którym wspomniał Chris.
Pavel
1
Jeśli php-json był zależny od php-common, to wszystko zniknęłoby ... bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1280030 ... proszę zagłosuj, jeśli to był dla ciebie problem.
rickfoosusa,
20
Czy ktoś uważa za ironicznie „złe”, że to wykluczenie z licencji na oprogramowanie kosztowało mnie godzinę badań?
recursion.ninja
13

Z Ubuntu:

sudo apt-get install php5-json
sudo service php5-fpm restart
David
źródło
A co apt-get install php7.2-json z 7.2. Próbowałem tego, ale nadal nie działa. Daje mi błąd w aplikacji laravel php RuntimeException PHP's json extension is required to use Monolog's NormalizerFormatter
Smit Patel
8

Rozwiązanie dla użytkowników LAMP:

apt-get install php5-json
service apache2 restart

Źródło

Milkovsky
źródło
Jeśli ponowne uruchomienie nie rozwiąże problemu, zakończ procesy Apache2 i uruchom: sudo pkill apache2; service apache2 start
xilef
3

Jeśli używasz phpbrew, spróbuj zainstalować rozszerzenie json, aby naprawić błąd za pomocą niezdefiniowanej funkcji json_decode () :

phpbrew ext install json
yesnik
źródło
2

Ten sam problem z 7.1

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

  • Dodaj json.so do nowego pliku
  • Dodaj odpowiedni link symboliczny pod conf. D
  • Uruchom ponownie usługę Apache2 (w razie potrzeby)
Carl Hinton
źródło
2

Mam to samo pytanie: PHP Fatal error: Call to undefined function json_decode()ale uruchamiam php pod cygwin w systemie Windows. Po uruchomieniu php -mstwierdziłem, że nie ma zainstalowanego modułu json. Więc ponownie uruchamiam cygwin setup.exe, sprawdzam pakiet json z interfejsu konfiguracyjnego i problem został rozwiązany.

Rafy
źródło
1

Moduł został zainstalowany, ale dowiązania symbolicznego nie było w /etc/php5/cli/conf.d

NicoMinsk
źródło
0

możesz również rozważyć całkowite uniknięcie podstawowego modułu PHP.

W dzisiejszych czasach dość często używa się narzędzi guzzle json jako biblioteki w aplikacjach PHP. Jeśli Twoja aplikacja jest aplikacją kompozytora, umieszczenie ich jako części kompilacji kompozytora jest trywialne. Narzędzie guzzle, jako biblioteka, będzie zamiennikiem narzędzia json pod klucz, jeśli powiesz PHP, aby automatycznie włączył to narzędzie.

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

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

jaxxed
źródło
Guzzle's json_decode używa php json_decode z dodatkowym sprawdzaniem błędów, więc twoja odpowiedź jest nieprawidłowa
emix
0

CENTOS

Scena

Zainstalowałem PHP w Centos Docker, to jest mój plik 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"]

Aplikacja zwróciła ten sam błąd z kodami json_decode i json_encode

Rozkład

Zainstaluj PHP Common, które ma json_encode i json_decode

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

Jak znaleźć rozdzielczość?

Mam inny plik Dockera, który buduje kontener dla API i ma kolejność instalacji klienta php-mysql:

yum install php72w-mysql.x86_64 -y

Jeśli użyję tego obrazu do zamontowania aplikacji, json_encode i json_decode będą działać !! Ok ..... Jakie ma to zależności?

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

Tak! Wewnątrz zależności znajdują się wspólne pakiety. Zainstalowałem go w innym kontenerze i działa! Po umieszczeniu dyrektywy de w DockerFile, zatwierdzenie Git !! Git Tag !!!! Git Push !!!! Gotowy!

Joan Teran
źródło