В прошлых частях речь шла только о том, как использовать сессию и как ее идентифицировать. Теперь я расскажу, как хранятся данные сессии, которые мы помещаем в массив $_SESSION.
Данные хранятся на стороне сервера и об их наличии и составе пользователь может только догадываться.
В программе эти данные могут состоять из любых типов данных, доступных программисту: строки, числа, массивы и объекты, но не ресурсы (об этом ниже).
При записи данные подвергаются процедуре сериализации (serialization) - преобразования структур любой сложности (не содержащих ресурсов) в строку, из которой в последствии можно восстановить структуру назад. Для сериализации используется функция serialize(). Для обратного процесса - десериализации - unserialize(). При старте сессии эти PHP, получив от обработчика сессии строку, посредством функции unserialize() восстанавливает данные и помещает их в массив $_SESSION. При завершении программы происходит обратный
процесс: массив $_SESSION автоматически сериализуется и строка передается обработчику сессии для записи. Т.е. обработчик сессии работает только со строкой и не зависит от сложности структуры хранимых данных.
Хотя процедура проходит автоматически, в ней то же есть свои тонкости и ограничения.
Рассмотрим особенности работы сериализации:
Ссылки.
Если Вы не знакомы с работой ссылок в PHP, то почитайте обучающую литературу или почитайте замечательный онлайновый справочник.
Массив $_SESSION, как и любой другой массив, может содержать ссылки на другие переменные, а так же может содержать объекты и массивы, которые тоже содержат ссылки. Возможна да же рекурсивная связь.
Можно сериализовать массив целиком и потом восстановить его. Но если попытаться сериализовать отдельно $array['a'] и $array['b'], а потом их восстановить, то связи будут нарушены.
Вот пример такого разрушения связей. Для наглядности я добавил элемент массива $array['a']['val'].
Аналогично выглядит проблема ссылок в объектах. Как раз такой случай описан здесь.
Объекты и их классы.
Можно сериализовать любой объект, сохранить его в хранилище и в следующий раз изъять и восстановить. В отличие от массивов объекты помимо данных содержат информацию о своем классе, методы и прочую "нагрузку". Особенность сериализации в том, что сохраняется только состояние объекта - его данные, а для "оживления" обязательно заранее должен быть объявлен класс.