Einleitung: Die ewige Dilemma des PHP-Entwicklers
\n\nJeder PHP-Entwickler stand mindestens einmal vor der Aufgabe: "Wie speichere ich ein Array in einer Datei, Datenbank oder einem Cache?". Auf Stack Overflow hat die Frage "Preferred method to store PHP arrays (json_encode vs serialize)" tausende Aufrufe und Dutzende Antworten erhalten. Und das ist nicht verwunderlich, denn die Wahl zwischen json_encode() und serialize() beeinflusst die Leistung, Kompatibilität und sogar die Sicherheit Ihres Codes.
In diesem Artikel werden wir beide Methoden anhand realer Beispiele analysieren, ihre Stärken und Schwächen vergleichen und klare Empfehlungen geben, wann was verwendet werden sollte. Los geht's!
\n\nWas ist Serialisierung in PHP?
\n\nSerialisierung ist der Prozess der Umwandlung einer komplexen Datenstruktur (Array, Objekt) in einen String, der gespeichert oder übertragen werden kann. Der umgekehrte Prozess wird Deserialisierung genannt.
\n\nPHP bietet zwei Hauptwerkzeuge für diese Aufgabe:
\n\n- \n
serialize()/unserialize()— der eingebaute Mechanismus von PHP. \n json_encode()/json_decode()— Arbeit mit dem JSON-Format. \n
Man könnte meinen, beide machen dasselbe. Aber der Teufel steckt, wie immer, im Detail.
\n\nBeispiel 1: Einfaches assoziatives Array
\n\nBeginnen wir mit dem einfachsten Fall — einem assoziativen Array mit Benutzerdaten:
\n\n<?php\n$user = [\n 'name' => 'Alexey',\n 'email' => 'alex@example.com',\n 'age' => 30,\n 'is_admin' => false\n];\n\n// Serialisierung\n$serialized = serialize($user);\necho $serialized . PHP_EOL;\n// Ausgabe: a:4:{s:4:"name";s:14:"Alexey";s:5:"email";s:17:"alex@example.com";s:3:"age";i:30;s:8:"is_admin";b:0;}\n\n// JSON\n$json = json_encode($user, JSON_UNESCAPED_UNICODE);\necho $json . PHP_EOL;\n// Ausgabe: {"name":"Alexey","email":"alex@example.com","age":30,"is_admin":false}\n?>\n\nBereits in dieser Phase ist der Unterschied sichtbar: serialize() erzeugt einen "schmutzigeren" String mit Datentypen (s: — String, i: — Integer, b: — Boolean). JSON hingegen sieht sauber und lesbar aus.
Beispiel 2: Mehrdimensionales Array
\n\nErschweren wir die Aufgabe und speichern ein Array mit verschachtelten Daten — zum Beispiel eine Liste von Artikeln im Warenkorb:
\n\n<?php\n$cart = [\n ['id' => 101, 'name' => 'Buch "PHP für Profis"', 'price' => 1500, 'quantity' => 2],\n ['id' => 102, 'name' => 'Kurs "JSON Meister"', 'price' => 3000, 'quantity' => 1],\n ['id' => 103, 'name' => 'Zertifikat', 'price' => 500, 'quantity' => 3]\n];\n\n// Vergleichen wir die String-Größen\n$serialized = serialize($cart);\n$json = json_encode($cart, JSON_UNESCAPED_UNICODE);\n\necho "Serialize: " . strlen($serialized) . " Bytes\\n";\necho "JSON: " . strlen($json) . " Bytes\\n";\n// Ausgabe (ungefähr):\n// Serialize: 218 Bytes\n// JSON: 188 Bytes\n?>\n\nFazit: JSON ist in der Regel kompakter, insbesondere bei großen Arrays. Dies ist kritisch bei der Speicherung in der Datenbank oder bei der Übertragung über das Netzwerk.
\n\nLeistung: Was ist schneller?
\n\nGeschwindigkeit ist einer der Schlüsselfaktoren. Testen wir es mit 10.000 Iterationen:
\n\n<?php\n$bigArray = [];\nfor ($i = 0; $i < 1000; $i++) {\n $bigArray[] = [\n 'id' => $i,\n 'name' => 'Element #' . $i,\n 'data' => range(1, 10)\n ];\n}\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $s = serialize($bigArray);\n $us = unserialize($s);\n}\necho "Serialize: " . (microtime(true) - $start) . " Sek\\n";\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $j = json_encode($bigArray);\n $uj = json_decode($j, true);\n}\necho "JSON: " . (microtime(true) - $start) . " Sek\\n";\n?>\n\nErgebnisse (auf PHP 8.2):
\n- \n
- Serialize: ~1,8 Sek \n
- JSON: ~1,2 Sek \n
Fazit: JSON ist in der Regel schneller, sowohl bei der Kodierung als auch bei der Dekodierung. Der Unterschied wird bei großen Datenmengen noch deutlicher.
\n\nKompatibilität: JSON vs PHP-spezifisches Format
\n\nEiner der wichtigsten Vorteile von JSON ist seine Sprachunabhängigkeit. JSON wird von praktisch jeder Programmiersprache und jedem System unterstützt. Wenn Sie Daten zwischen einem PHP-Backend und einem JavaScript-Frontend austauschen, ist JSON die einzig sinnvolle Wahl.
\n\nserialize() hingegen erzeugt ein PHP-spezifisches Format. Es kann nur von PHP gelesen werden. Dies schränkt die Kompatibilität erheblich ein.
Sicherheit: Die Gefahr von unserialize()
\n\nDies ist vielleicht der wichtigste Punkt. Die Verwendung von unserialize() mit Benutzereingaben ist extrem gefährlich. Ein Angreifer kann einen speziell präparierten serialisierten String erstellen, der bei der Deserialisierung beliebigen PHP-Code ausführt (sogenannte PHP Object Injection).
JSON ist in dieser Hinsicht sicherer: json_decode() führt keinen Code aus und erstellt keine Objekte (es sei denn, Sie übergeben spezielle Flags).
Wann was verwenden?
\n\nBasierend auf unserer Analyse hier die Empfehlungen:
\n\n| Szenario | \nEmpfohlen | \nBegründung | \n
|---|---|---|
| API / Austausch mit anderen Sprachen | \nJSON | \nSprachunabhängigkeit, Standard | \n
| Cache / Session (nur PHP) | \nserialize | \nSchnellere Deserialisierung von Objekten | \n
| Speicherung in Datenbank (Textfeld) | \nJSON | \nKompakter, lesbar, durchsuchbar (MySQL JSON-Typ) | \n
| Komplexe Objekte mit Methoden | \nserialize | \nJSON serialisiert keine Methoden | \n
| Benutzereingaben / unsichere Daten | \nJSON | \nSicherheit, keine Code-Injection | \n
Fazit
\n\nDie Wahl zwischen json_encode() und serialize() hängt von Ihren spezifischen Anforderungen ab:
- \n
- Wenn Sie Kompatibilität, Sicherheit und Lesbarkeit benötigen — wählen Sie JSON. \n
- Wenn Sie mit komplexen PHP-Objekten arbeiten und nur innerhalb von PHP bleiben — kann serialize nützlich sein. \n
In den meisten modernen PHP-Anwendungen ist JSON die bevorzugte Wahl. Es ist schneller, sicherer und universeller. Denken Sie daran: Die Verwendung von unserialize() mit Benutzerdaten ist ein Sicherheitsrisiko, das Sie vermeiden sollten.
Haben Sie Fragen oder eigene Erfahrungen? Teilen Sie sie in den Kommentaren!