PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


undefined function json_encode(): Distributionen tauschen JSON Extension

with 5 comments

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()

JSON LogoDiese 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

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=692613

http://iteration99.com/2013/php-json-removed-from-php-5-5/

Written by Michael Kliewe

Oktober 31st, 2013 at 10:13 am

5 Responses to 'undefined function json_encode(): Distributionen tauschen JSON Extension'

Subscribe to comments with RSS or TrackBack to 'undefined function json_encode(): Distributionen tauschen JSON Extension'.

  1. 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

  2. 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

  3. […] 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 […]

  4. hmmm… gut zu wissen.. danke dir :-)

    gjerokrsteski

    15 Nov 13 at 15:46

  5. 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

Leave a Reply

You can add images to your comment by clicking here.