Preferred method to store PHP arrays (json_encode vs serialize)
Depends on your priorities.
If performance is your absolute driving characteristic, then by all means use the fastest one. Just make sure you have a full understanding of the differences before you make a choice
- Unlike
serialize()
you need to add extra parameter to keep UTF-8 characters untouched:json_encode($array, JSON_UNESCAPED_UNICODE)
(otherwise it converts UTF-8 characters to Unicode escape sequences). - JSON will have no memory of what the object's original class was (they are always restored as instances of stdClass).
- You can't leverage
__sleep()
and__wakeup()
with JSON - By default, only public properties are serialized with JSON. (in
PHP>=5.4
you can implement JsonSerializable to change this behavior). - JSON is more portable
And there's probably a few other differences I can't think of at the moment.
A simple speed test to compare the two
<?phpini_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 themif ($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 is simpler and faster than PHP's serialization format and should be used unless:
- You're storing deeply nested arrays:
json_decode()
: "This function will return false if the JSON encoded data is deeper than 127 elements." - You're storing objects that need to be unserialized as the correct class
- You're interacting with old PHP versions that don't support json_decode
I've written a blogpost about this subject: "Cache a large array: JSON, serialize or var_export?". In this post it is shown that serialize is the best choice for small to large sized arrays. For very large arrays (> 70MB) JSON is the better choice.