Баг в igbinary 1.1.1 при сериализации сессий в MongoDB Session Handler
В этом посте я расскажу о баге, на посик которого мы потратили три дня. Периодически PHP сыпался SegFault. Очень долго ловили этот баг.
Igbinary
Для начала стоит рассказать, что за расширение igbinary, и для чего оно нужно. Igbinary используется для сохранения объектов, массивов и других сущностей языка программирования в виде строки используются методы сериализации типа serialize() и unserialize(). Они сериализуют объект в строку такого вида:
1 |
a:4:{i:0;i:1;i:1;i:2;i:2;s:5:"three";i:3;b:1;} |
Но как вы видите в этом формате много служебных данных. По этой же причине кстати я не люблю XML. Вместо него я использую json, а что же юзать вместо serialize? Как раз таки igbinary_serialize(). А в результате Igbinary сжимает данные в 2,5 раза лучше, чем serialize. Бенчмарк igbinary тут.
Use cases
В основном сериализация на базе igbinary используется для:
- Хранения данных сессий. Сессии, сжимаемые igbinary и хранимые в MongoDB дают нам распределённое отказоустойчивое быстрое хранилище сессий.
- Хранение элементов в Memcached. Опять же экономим ресурсы сервера.
- Сетевой обмен данными между частями кластера или подлсистемами веб-приложения.
Бага с igbinary
Ошибка возникает при попытке сериализации с помощью igbinary вложенных объектов.
Spotted a hard crash issue that seems to be linked to igbinary/
spl_array below are back traces, I will also open a bug within PHP’s
list for Spl_Array.c.Seems to be related to multi-object nesting and only starts to
segfault when Memcached::SERIALIZER_IGBINARY is set .vs
Memcached::SERIALIZER_PHP for Memcached.
Соответственно при попытке записать в сессию вложенный объект, а например Zend_Auth насколько я знаю является таковым, он и вылезает.
Решение
Удивляет то, что баг встречается в версии igbinary 1.1.1, которая вроде-бы стабильная на данный момент. Пробелму пофиксили в версии 1.1.2-DEV, которую можно скачать с GitHub. После обновления всё заработало нормально.
Ссылки
http://alekseykorzun.com/post/5249986502/igbinary-nested-objects-crash-fixed
http://groups.google.com/group/igbinary/browse_thread/thread/16b8824cbce14c83