Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode

Сериализация в PHP

Будут сравниваться 4 способа сериализации:

  1. Стандартная сериализация serialize
  2. JSON
  3. msgpack
  4. igbinary

Кратко об установке

JSON раньше шел в стандартной поставке PHP. Сейчас нужно поставить дополнительное расширение php5-json.

msgpack
Сайт: http://msgpack.org/
Исходники: github.com/msgpack/msgpack-php и http://pecl.php.net/package/msgpack
Ставим:

cd /tmp
wget http://pecl.php.net/get/msgpack-0.5.5.tgz
tar xzf msgpack-0.5.5.tgz
cd msgpack-0.5.5
phpize
./configure
make
make test

Если тесты прошли нормально, то создаем пакет и ставим:

sudo checkinstall -D --install=no
sudo dpkg -i msgpack_0.5.5-1_amd64.deb

igbinary
Исходники: github.com/phadej/igbinary и http://pecl.php.net/package/igbinary
Далее опять:

cd /tmp
wget http://pecl.php.net/get/igbinary-1.1.1.tgz
tar xzf igbinary-1.1.1.tgz
cd igbinary-1.1.1
phpize
./configure
make
make test
sudo checkinstall -D --install=no
sudo dpkg -i igbinary_1.1.1-1_amd64.deb

msgpack добавляет функции:

BinData msgpack_pack(phpValue);
phpValue msgpack_unpack(BinData);

igbinary добавляет функции:

BinData igbinary_serialize(phpValue);
phpValue igbinary_unserialize($BinData);

Чтобы они заработали, нужно не забыть включить их в php.ini:

[igbinary]
extension=igbinary.so

; Enable or disable compacting of duplicate strings
; The default is On.
;igbinary.compact_strings=On

[msgpack]
extension=msgpack.so

Что еще важно отметить

  • serialize — стандартная функция PHP.
  • JSON — старое и стабильное расширение.
  • igbinary — тоже достаточно старая библиотека, давно вышедшая в стабильную ветку.
  • msgpack — на данный момент все еще находится в стадии beta. С msgpack мне реально доводилось ловить глюки в ее предыдущих релизах. И если я решусь внедрять ее в продакшен, то только там, где ее ошибки не принесут фатального ущерба.

Тесты


1. Массив ассоциативный: вложенные массивы и строки

array (
  'v0' => 
    array (
      0 => 0,
      1 => 1,
      2 => 2,
      ...
      3 => 3,
      23 => 23,
      24 => 24,
    ),
  'rnd0' => '2e0c883df6e2cb771103f4409f053549094d6787',
  ...
)

c 16384 элементами

Время сериализации (msec) Время десериализации (msec) Размер упакованных данных (Kb)
MessagePack 9 25 678
igbinary
compact_strings=Off
9 32 1278
igbinary
compact_strings=On
16 32 1120
JSON 14 318 1022
SERIALIZE 62 39 2486

2. Массив числовой: большие массивы целых чисел

array (
  0 => 3183,
  1 => 4527,
  2 => 4084,
  3 => 4032,
  4 => 3920,
  ...
  262144 => 4455,
)
Время сериализации (msec) Время десериализации (msec) Размер упакованных данных (Kb)
MessagePack 8 30 769
igbinary
compact_strings=Off
9 33 1920
igbinary
compact_strings=On
9 33 1920
JSON 15 107 1281
SERIALIZE 86 44 3988

3. Массив числовой: большие массивы длинных целых чисел (int64)

array (
  0 => 7679461759223599104,
  1 => 4898705982311625344,
  2 => 5880628818820227328,
  ...
  262144 => 6940876209816891904,
)
Время сериализации (msec) Время десериализации (msec) Размер упакованных данных (Kb)
MessagePack 10 29 2305
igbinary
compact_strings=Off
11 33 3456
igbinary
compact_strings=On
11 33 3456
JSON 20 172 5121
SERIALIZE 92 49 7828

4. Массив числовой: большие массивы чисел с плавающей точкой (float)

array (
  0 => 0.00038631346578366,
  1 => 0.00016131634134538,
  2 => 0.00043595779928503,
  3 => 0.00011754334410814,
  4 => 0.00049353469548909,
  5 => 5.2391680201184E-5,
  ...
  262144 => 0.00041876046901173,
)
Время сериализации (msec) Время десериализации (msec) Размер упакованных данных (Kb)
MessagePack 9 28 2305
igbinary
compact_strings=Off
11 33 3456
igbinary
compact_strings=On
11 33 3456
JSON 75 197 5061
SERIALIZE 264 176 8538

5. Массив строковый: большие массивы длинных строк

array (
  0 => 'f7df8cb47630b8cd7eb73d0da7a23b9c01aaaa84f718499c1c8cef6730f9fd03c8125cab',
  1 => 'd30f79cf7fef47bd7a5611719f936539bec0d2e93bcf6eecb2611212e088d0d91f2ade9c',
  2 => '86bce22a4d2805649853ac7909c4efb4dd18f255086af6e4641abb18caafc151b9aa95c8',
  3 => '63afd0edc0371ad842d7a7ecc76260be4bc3e8c0da6cb383f8f9e58f2c8af88a8c0eb65e',
  4 => '13c80015875a668e8fc059517ffd124abbda63c12d95666e2649fcfc6e3af75e09f5adb9',
  ...
  32768 => '0e3808238b738aafc13a2a62f36d2a49dec4e191c22abfa379f38b5b0411bc11fa9bf92f',
)
Время сериализации (msec) Время десериализации (msec) Размер упакованных данных (Kb)
MessagePack 4 5 2401
igbinary
compact_strings=Off
4 6 2464
igbinary
compact_strings=On
21 6 2463
JSON 28 16 2401
SERIALIZE 10 7 2806

Замечу, что приведенные в таблицах данные являются примерными и зависят от данных. Так как данные у меня заполнялись случайным образом, то цифры получались разные, но разница несущественна и в целом эти цифры отражают реальную картину.