Блог

PHP/Сериализация: unserialize() подводный камень

В PHP есть такая замечательная технология как Serialize, не всегда есть смысл использовать эту технологию но в тоже время очень полезна. Когда нужно сохранить объекты с большим объемом данных лучше использовать Serialize, а если простой массив данных то сжимать в JSON.

Очень много работаю с Zend Framework и вся работа завязана на объектах. К примеру вам нужно создать модуль Revision Control System. Что подразумевает под собой модуль Revision – вам нужно хранить всю историю изменений записи, но модуль должен быть универсальным, чтобы можно было применить к другим модулям. Хранится, полностью вся информация ревизии.

По этой причине я использую serialize() и unserialize(). Сериализация объекта позволяет хранить информацию в строковом формате, одну длинную строку. В любом случае, я наткнулся на следующую ошибку при тестировании десериализации, объекты что я сериализовывал, выдавали ошибку.

Notice: unserialize(): Error at offset 2 of 52 bytes in file.php on line 111

Оказывается, что если есть “, ‘, :, или ; в любом из значений массива сериализации будет поврежден я нашел следующее исправление для этой проблемы на php.net.

//to safely serialize
$safe_string_to_store = base64_encode(serialize($multidimensional_array));

//to unserialize…
$array_restored_from_db = unserialize(base64_decode($encoded_serialized_string));

Отлично решает задачу…