Kommt auf deine Prioritäten an.
Wenn Leistung Ihre absolute Fahrcharakteristik ist, verwenden Sie auf jeden Fall die schnellste. Stellen Sie einfach sicher, dass Sie die Unterschiede vollständig verstanden haben, bevor Sie eine Wahl treffen
- Im Gegensatz
serialize()
dazu müssen Sie zusätzliche Parameter hinzufügen, um UTF-8-Zeichen unberührt zu lassen: json_encode($array, JSON_UNESCAPED_UNICODE)
(Andernfalls werden UTF-8-Zeichen in Unicode-Escape-Sequenzen konvertiert.)
- JSON hat keine Erinnerung an die ursprüngliche Klasse des Objekts (sie werden immer als Instanzen von stdClass wiederhergestellt).
- Sie können
__sleep()
und __wakeup()
mit JSON nicht nutzen
- Standardmäßig werden nur öffentliche Eigenschaften mit JSON serialisiert. (In können
PHP>=5.4
Sie JsonSerializable implementieren , um dieses Verhalten zu ändern.)
- JSON ist portabler
Und es gibt wahrscheinlich noch ein paar andere Unterschiede, an die ich im Moment nicht denken kann.
Ein einfacher Geschwindigkeitstest, um die beiden zu vergleichen
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Make a big, honkin test array
// You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray(0, 5);
// Time json encoding
$start = microtime(true);
json_encode($testArray);
$jsonTime = microtime(true) - $start;
echo "JSON encoded in $jsonTime seconds\n";
// Time serialization
$start = microtime(true);
serialize($testArray);
$serializeTime = microtime(true) - $start;
echo "PHP serialized in $serializeTime seconds\n";
// Compare them
if ($jsonTime < $serializeTime) {
printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);
}
else if ($serializeTime < $jsonTime ) {
printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
echo "Impossible!\n";
}
function fillArray( $depth, $max ) {
static $seed;
if (is_null($seed)) {
$seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
}
if ($depth < $max) {
$node = array();
foreach ($seed as $key) {
$node[$key] = fillArray($depth + 1, $max);
}
return $node;
}
return 'empty';
}
JSON_UNESCAPED_UNICODE
.json_encode
) und es ist durchschnittlich 131% schneller als jetzt serialisieren. Es muss also einige nette Verbesserungen an dieser Funktion in 5.4.x gegenüber 5.3.x geben. Insbesondere verwende ich 5.4.24 unter CentOS 6. Also, yay für JSON !!serialize() was roughly 35.04% faster than json_encode()
JSON ist einfacher und schneller als das Serialisierungsformat von PHP und sollte verwendet werden, es sei denn :
json_decode()
"Diese Funktion gibt false zurück, wenn die JSON-codierten Daten tiefer als 127 Elemente sind."quelle
Ich habe einen Blogpost zu diesem Thema geschrieben:
" Ein großes Array zwischenspeichern: JSON, serialize oder var_export? ". In diesem Beitrag wird gezeigt, dass Serialisierung die beste Wahl für kleine bis große Arrays ist. Für sehr große Arrays (> 70 MB) ist JSON die bessere Wahl.quelle
json_encode()
ist die Funktion etwa 80% bis 150% schneller (sie geht dort wirklich auf und ab) alsserialize()
mit etwa 300 Iterationen. Bei Verwendung der kleineren Arrays (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
) habe ich jedoch mit 750.000 Iterationen getestet und bin in diesem Fallserialize()
etwa 6% bis 10% schneller. Meine Funktion nimmt die Durchschnittszeiten für alle Iterationen und vergleicht sie. Ich könnte es hier als eine der AntwortenSie könnten auch an https://github.com/phadej/igbinary interessiert sein - das eine andere Serialisierungs-Engine für PHP bietet.
Meine zufälligen / willkürlichen Leistungszahlen mit PHP 5.3.5 auf einer 64-Bit-Plattform zeigen:
JSON:
Natives PHP:
Igbinary:
Es ist also schneller, igbinary_serialize () und igbinary_unserialize () zu verwenden, und es wird weniger Speicherplatz benötigt.
Ich habe den Code fillArray (0, 3) wie oben verwendet, aber die Array-Schlüssel zu längeren Zeichenfolgen gemacht.
igbinary kann dieselben Datentypen speichern wie die native Serialisierung von PHP (also kein Problem mit Objekten usw.), und Sie können PHP5.3 anweisen, es für die Sitzungsbehandlung zu verwenden, wenn Sie dies wünschen.
Siehe auch http://ilia.ws/files/zendcon_2010_hidden_features.pdf - speziell Folien 14/15/16
quelle
Y hat gerade die serialisierte und json-Codierung und -Decodierung sowie die Größe der gespeicherten Zeichenfolge getestet.
Wir können daraus schließen, dass JSON schneller codiert und eine kleinere Zeichenfolge ergibt, aber unserialize die Zeichenfolge schneller decodiert.
quelle
Wenn Sie Informationen zwischenspeichern, die Sie zu einem späteren Zeitpunkt letztendlich "einschließen" möchten, sollten Sie versuchen, var_export zu verwenden . Auf diese Weise erhalten Sie den Treffer nur in der "Serialisierung" und nicht in der "Unserialisierung".
quelle
Ich habe den Test um die Leistung unserer Unserialisierung erweitert. Hier sind die Zahlen, die ich bekommen habe.
Json scheint also schneller für die Codierung zu sein, aber langsam für die Decodierung. Es kann also von Ihrer Anwendung abhängen und davon, was Sie am meisten erwarten.
quelle
Wirklich schönes Thema und nachdem ich die wenigen Antworten gelesen habe, möchte ich meine Experimente zu diesem Thema teilen.
Ich habe einen Anwendungsfall, in dem fast jedes Mal, wenn ich mit der Datenbank spreche, eine "riesige" Tabelle abgefragt werden muss (fragen Sie nicht warum, nur eine Tatsache). Das Datenbank-Caching-System ist nicht geeignet, da es die verschiedenen Anforderungen nicht zwischenspeichert. Daher habe ich über PHP-Caching-Systeme nachgedacht.
Ich habe es versucht,
apcu
aber es passte nicht zu den Anforderungen. Der Speicher ist in diesem Fall nicht zuverlässig genug. Der nächste Schritt bestand darin, eine Datei mit Serialisierung zwischenzuspeichern.Die Tabelle enthält 14355 Einträge mit 18 Spalten. Dies sind meine Tests und Statistiken zum Lesen des serialisierten Caches:
JSON:
Wie Sie alle sagten, besteht die größte Unannehmlichkeit bei
json_encode
/json_decode
darin, dass alles in eineStdClass
Instanz (oder ein Objekt) umgewandelt wird. Wenn Sie es schleifen müssen, werden Sie es wahrscheinlich in ein Array umwandeln, und ja, es erhöht die UmwandlungszeitMsgpack
@ Hutch erwähnt msgpack . Hübsche Website. Probieren wir es aus.
Das ist besser, erfordert aber eine neue Erweiterung. manchmal ängstliche Menschen zusammenstellen ...
IgBinary
@ GingerDog erwähnt igbinary . Beachten Sie, dass ich das festgelegt habe,
igbinary.compact_strings=Off
weil mir die Leseleistung wichtiger ist als die Dateigröße.Besser als msg pack. Dies erfordert jedoch auch das Kompilieren.
serialize
/.unserialize
Bessere Leistungen als JSON, je größer das Array ist, desto langsamer
json_decode
ist es, aber das ist Ihnen bereits neu.Diese externen Erweiterungen verringern die Dateigröße und scheinen auf dem Papier großartig zu sein. Zahlen lügen nicht *. Was bringt es, eine Erweiterung zu kompilieren, wenn Sie fast die gleichen Ergebnisse erzielen, die Sie mit einer Standard-PHP-Funktion erzielen würden?
Wir können auch ableiten, dass Sie je nach Ihren Bedürfnissen etwas anderes wählen als jemand anderes:
Das war's, ein weiterer Vergleich der Serialisierungsmethoden, der Ihnen bei der Auswahl hilft!
* Getestet mit PHPUnit 3.7.31, PHP 5.5.10 - nur Dekodierung mit einer Standard-Festplatte und einer alten Dual-Core-CPU - durchschnittliche Anzahl bei 10 gleichen Anwendungsfalltests, Ihre Statistiken können unterschiedlich sein
quelle
json_decode($object, true)
, dass es im Grunde das Gleiche tut,(array) json_decode($object)
aber rekursiv, so dass dies das gleiche Verhalten wäre und in beiden Fällen erhebliche Kosten verursacht. Beachten Sie, dass ich keine Leistungsunterschiede zwischenStdClass
und getestet habe,array
aber das ist hier nicht wirklich der Punkt.Scheint, als würde serialize aus zwei Gründen verwendet:
Jemand wies darauf hin, dass unserialize schneller ist als json_decode und ein 'read'-Fall wahrscheinlicher klingt als ein' write'-Fall.
Ich hatte Probleme mit json_encode, wenn Zeichenfolgen mit ungültigen UTF-8-Zeichen vorhanden waren. In diesem Fall ist die Zeichenfolge leer und führt zu Informationsverlust.
quelle
Ich habe dies sehr gründlich an einem ziemlich komplexen, leicht verschachtelten Multi-Hash mit allen Arten von Daten (String, NULL, Ganzzahlen) getestet, und Serialize / Unserialize endete viel schneller als json_encode / json_decode.
Der einzige Vorteil, den json in meinen Tests hatte, war die kleinere Größe.
Diese werden unter PHP 5.3.3 durchgeführt. Lassen Sie mich wissen, wenn Sie weitere Details wünschen.
Hier sind Testergebnisse und dann der Code, um sie zu erzeugen. Ich kann die Testdaten nicht bereitstellen, da sie Informationen enthalten, die ich nicht in freier Wildbahn veröffentlichen darf.
quelle
Ich habe auch einen kleinen Benchmark gemacht. Meine Ergebnisse waren die gleichen. Aber ich brauche die Dekodierungsleistung. Wo ich bemerkt habe, wie ein paar Leute oben auch sagten,
unserialize
ist schneller alsjson_decode
.unserialize
dauert ungefähr 60-70% derjson_decode
Zeit. Die Schlussfolgerung ist also ziemlich einfach: Wenn Sie Leistung beim Codieren benötigen, verwenden Siejson_encode
, wenn Sie Leistung beim Decodieren benötigen, verwenden Sieunserialize
. Da Sie die beiden Funktionen nicht zusammenführen können, müssen Sie eine Auswahl treffen, bei der Sie mehr Leistung benötigen.Mein Benchmark in Pseudo:
Im Durchschnitt: unserialize hat 96-mal über 4-mal den json_decode gewonnen. Mit einem Durchschnitt von ungefähr 1,5 ms über 2,5 ms.
quelle
Bevor Sie Ihre endgültige Entscheidung treffen, beachten Sie, dass das JSON-Format für assoziative Arrays nicht sicher ist.
json_decode()
Stattdessen werden sie als Objekte zurückgegeben:Ausgabe ist:
quelle
json_encode
einem assoziativen Array codiert haben, es glücklicherweise wie folgt in ein Array zurückzwingen kann:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
Beachten Sie außerdem, dass Sie in einem typischen Szenario auf Objekte wie auf Arrays in PHP zugreifen können. man würde nicht einmal den Unterschied kennen. Guter Punkt!Zuerst habe ich das Skript geändert, um mehr Benchmarking durchzuführen (und auch 1000 Läufe statt nur 1):
Ich habe diesen Build von PHP 7 verwendet:
Und meine Ergebnisse waren:
Serialize / unserialize ist also eindeutig die schnellste Methode, während json_encode / decode die portabelste ist.
Wenn Sie ein Szenario in Betracht ziehen, in dem Sie serialisierte Daten 10x oder öfter lesen / schreiben, als Sie an ein Nicht-PHP-System senden oder von diesem empfangen müssen, ist es NOCH besser, serialize / unserialize zu verwenden und es vor der Serialisierung mit json_encode oder json_decode zu versehen in Bezug auf die Zeit.
quelle
Schauen Sie sich die Ergebnisse hier an (entschuldigen Sie den Hack, der den PHP-Code in das JS-Code-Feld gestellt hat):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
ERGEBNISSE:
serialize()
undunserialize()
beide sind in PHP 5.4 auf Arrays unterschiedlicher Größe signifikant schneller.Ich habe ein Testskript für reale Daten erstellt, um json_encode mit serialize und json_decode mit unserialize zu vergleichen. Der Test wurde auf dem Caching-System einer E-Commerce-Site in der Produktion ausgeführt. Es nimmt einfach die Daten, die sich bereits im Cache befinden, und testet die Zeiten, um alle Daten zu codieren / decodieren (oder zu serialisieren / unserialisieren), und ich füge sie in eine übersichtliche Tabelle ein.
Ich habe dies auf einem gemeinsam genutzten PHP 5.4-Hosting-Server ausgeführt.
Die Ergebnisse waren sehr schlüssig, dass für diese großen bis kleinen Datensätze Serialisierung und Unserialisierung die klaren Gewinner waren. Insbesondere für meinen Anwendungsfall sind json_decode und unserialize für das Caching-System am wichtigsten. Unserialize war hier fast ein allgegenwärtiger Gewinner. Es war normalerweise 2 bis 4 Mal (manchmal 6 oder 7 Mal) so schnell wie json_decode.
Es ist interessant, den Unterschied in den Ergebnissen von @ peter-bailey zu bemerken.
Hier ist der PHP-Code, mit dem die Ergebnisse generiert werden:
quelle
Nur zu Ihrer Information: Wenn Sie Ihre Daten zu etwas leicht lesbarem und verständlichem wie JSON serialisieren möchten, das jedoch komprimierter und leistungsfähiger ist, sollten Sie sich das Messagepack ansehen.
quelle
JSON ist besser, wenn Sie Daten sichern und auf einem anderen Computer oder über FTP wiederherstellen möchten.
Wenn Sie beispielsweise beim Serialisieren Daten auf einem Windows-Server speichern, über FTP herunterladen und unter einem Linux-Server wiederherstellen, funktioniert dies aufgrund der Neukodierung des Zeichens nicht mehr, da beim Serialisieren die Länge der Zeichenfolgen und im Unicode gespeichert werden > UTF-8-Transcodierung von 1-Byte-Zeichen kann 2 Byte lang werden, wodurch der Algorithmus abstürzt.
quelle
THX - für diesen Benchmark-Code:
Meine Ergebnisse für das Array, das ich für die Konfiguration verwende, sind wie folgt: JSON in 0,0031511783599854 Sekunden codiert
PHP in 0,0037961006164551 Sekunden serialisiert
json_encode()
war ungefähr 20,47% schneller alsserialize()
JSON in 0,0070841312408447 Sekunden codiertPHP in 0,0035839080810547 Sekunden
unserialize()
war ungefähr 97,66% schneller alsjson_encode()
Also - testen Sie es an Ihren eigenen Daten.
quelle
Wenn Sie zusammenfassen möchten, was die Leute hier sagen, scheint json_decode / encode schneller zu sein als serialize / unserialize, ABER wenn Sie var_dump ausführen, wird der Typ des serialisierten Objekts geändert. Wenn Sie aus irgendeinem Grund den Typ beibehalten möchten, wählen Sie serialisieren!
(versuchen Sie zum Beispiel stdClass vs Array)
serialisieren / unserialisieren:
json codieren / decodieren
Wie Sie sehen können, konvertiert json_encode / decode alles in stdClass, was nicht so gut ist, Objektinformationen gehen verloren ... Entscheiden Sie also basierend auf den Anforderungen, insbesondere wenn es sich nicht nur um Arrays handelt ...
quelle
Ich würde Ihnen empfehlen, Super Cache zu verwenden, einen Dateicache-Mechanismus, der
json_encode
oder nicht verwendetserialize
. Es ist einfach zu bedienen und im Vergleich zu anderen PHP-Cache-Mechanismen sehr schnell.https://packagist.org/packages/smart-php/super-cache
Ex:
quelle