Баг в igbinary 1.1.1 при сериализации сессий в MongoDB Session Handler

В этом посте я расскажу о баге, на посик которого мы потратили три дня. Периодически PHP сыпался SegFault. Очень долго ловили этот баг.

Igbinary

Для начала стоит рассказать, что за расширение igbinary, и для чего оно нужно. Igbinary используется для сохранения объектов, массивов и других сущностей языка программирования в виде строки используются методы сериализации типа serialize() и unserialize(). Они сериализуют объект в строку такого вида:

Но как вы видите в этом формате много служебных данных. По этой же причине кстати я не люблю 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

http://pecl.php.net/package/igbinary

http://blgo.ru/blog/2010/05/27/igbinary/

Leave a Comment