undefined function json_encode(): Distributionen tauschen JSON Extension
Letzte Woche habe ich zum ersten Mal folgende Fehlermeldungen gesehen:
PHP Fatal error: Call to undefined function json_decode() PHP Fatal error: Call to undefined function json_encode()
Diese Fehler kommen nach dem Upgrade auf PHP 5.5 unter Ubuntu 13.10. Doch warum kommt der Fehler, JSON ist doch schon seit langen Jahren (PHP 5.2) fest in PHP eingebaut? Auf der Suche nach der Lösung stösst man dann auf die folgenden Sätze:
– The Software shall be used for Good, not Evil.
– The freedom to run the program for any purpose.
Der erste Satz steht in den Lizenzbedingungen der JSON-Extension, die Teil des PHP-Kerns und eine C-Library vom Javascript-Guru und JSON-Erfinder Douglas Crockford ist.
Der zweite Satz stammt aus dem sogenannten „freedom 0“ der Free Software Foundation (FSF), den sehr viele große Distributionen unterstützen und übernehmen.
Diese beiden Lizenzbedingungen kollidieren, denn die FSF will dass Software frei ist und für jeglichen Einsatzzweck genutzt werden soll und darf, das ist die Freiheit der Nutzer. Douglas Crockford jedoch fordert von den Nutzern dass es „nur für Gutes“ genutzt wird, nicht für „Böses“. Was genau Gut und Böse ist wird nirgends spezifiziert.
Das Problem ist also nun dass die Lizenz von der FSF, Ubuntu, Debian, Mandriva, Fedora besagt, nur „freie Programme“ aufzunehmen, und die JSON-Bibliothek von Crockford nicht-frei (oder unfrei?) ist (free vs. non-free). Man fragte Douglas Crockford ob er diesen sehr schwammigen Satz entfernen könnte, damit man nicht diese Lizenzprobleme und Kollision habe. Seine Antwort: „The license looks fine to me.“ Sehr freundlich sagt er also Nein.
Die Lösung
Doch Rettung ist in Sicht: Die PHP Developer haben eine eigene Implementation (drop-in replacement) erstellt die nun wirklich „frei“ ist, verfügbar auf Github. In Ubuntu 13.10 kann diese freie Variante seit kurzem nachinstalliert werden mit einem einfachen „sudo apt-get install php5-json“.
Vanilla PHP enthält nach wie vor noch die ext/json Library von Douglas Crockford, denn die PHP-Lizenz kollidiert nicht. Wer also PHP von php.net herunterlädt hat kein Problem. Probleme gibt es nur bei Distributionen, die die problematische Extension entfernt haben. Einige (Beispiel Fedora) laden bereits automatisch die neue PECL/jsonc Extension, bei anderen (Ubuntu z.B.) muss man es noch manuell nachinstallieren, wird aber sicher auch bald wieder Teil von PHP unter Ubuntu werden.
Wer übrigens Zend_Json::encode($data) nutzt wird keine Probleme haben, denn wenn json_encode() nicht verfügbar ist wird die eigene JSON-Implementation des Zend Frameworks genommen, die aber natürlich langsamer ist als die in C geschriebenen Extensions.
Hier einige Links zu Bugreports und Blogposts:
https://bugs.php.net/bug.php?id=63520
Super Danke für den Tipp! Das wird mir sicherlich beim nächsten Update einiges an Zeit sparen!
Roger
3 Nov 13 at 11:11
Mkay.. es gibt nun also 3 Libs, die JSON decode können.
Manchmal wundere ich mich, wieso dieses ganze Zeug (noch) so gut funktioniert 🙂
beko
7 Nov 13 at 11:07
[…] Die Funktionen json_encode und json_decode werden nicht mehr mit PHP gebundelt. Dies liegt an einer Lizenzproblematik auf die ich jetzt nicht weiter eingehen […]
Ubuntu 13.10 Update – Magento läuft nicht mehr | Blog von Christian Münch
15 Nov 13 at 12:48
hmmm… gut zu wissen.. danke dir 🙂
gjerokrsteski
15 Nov 13 at 15:46
Das Verhalten von Douglas Crockford ist generell kaum nachvollziehbar.
Die JSON Bibliotheken von Crockford haben sogar ein paar Probleme.
Aufgrund der sehr „freundlichen“ Lizenzbestimmungen von ihm und der bestehenden Probleme (Pullrequests nimmt er fast nie an und seine Commitmessages sind „sehr selbsterklärend“) musste ich auch auf eine andere Library wechseln. Das hat sich aber am Ende gelohnt.
So muss ich nicht mehr nach einer besseren Alternative suchen und es funktioniert auch immer.
Douglas Crockford macht sich immer mehr „Freunde“, das verwundert mich aber kaum.
http://anton.kovalyov.net/p/why-jshint/
http://archive.is/ohS8x
Aber Douglas Crockford ist ja der JavaScript-Gott 😉
Daniel Ruf
30 Dez 13 at 16:54