Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #7




Поздравляем всех с праздником!

Сегодня продолжаем публикацию отрывков статей из серии "Сессии PHP".

Напоминаем, что остальные статьи этой серии можно прочесть здесь.

Заглядывайте на наш сайт и форум!

Сессии PHP. Часть 3.
Подготовка данных к сохранению.

В прошлых частях речь шла только о том, как использовать сессию и как ее идентифицировать. Теперь я расскажу, как хранятся данные сессии, которые мы помещаем в массив $_SESSION.

Данные хранятся на стороне сервера и об их наличии и составе пользователь может только догадываться.

В программе эти данные могут состоять из любых типов данных, доступных программисту: строки, числа, массивы и объекты, но не ресурсы (об этом ниже).

При записи данные подвергаются процедуре сериализации (serialization) - преобразования структур любой сложности (не содержащих ресурсов) в строку, из которой в последствии можно восстановить структуру назад. Для сериализации используется функция serialize(). Для обратного процесса - десериализации - unserialize(). При старте сессии эти PHP, получив от обработчика сессии строку, посредством функции unserialize() восстанавливает данные и помещает их в массив $_SESSION. При завершении программы происходит обратный процесс: массив $_SESSION автоматически сериализуется и строка передается обработчику сессии для записи. Т.е. обработчик сессии работает только со строкой и не зависит от сложности структуры хранимых данных.

Хотя процедура проходит автоматически, в ней то же есть свои тонкости и ограничения.

Рассмотрим особенности работы сериализации:

  1. Ссылки.

    Если Вы не знакомы с работой ссылок в PHP, то почитайте обучающую литературу или почитайте замечательный онлайновый справочник.

    Массив $_SESSION, как и любой другой массив, может содержать ссылки на другие переменные, а так же может содержать объекты и массивы, которые тоже содержат ссылки. Возможна да же рекурсивная связь.

    <?php
    
    $array['b'] = array();
    $array['a'] = array('bRef' => &$array['b']);
    $array['b']['aRef'] = &$array['a'];
    
    echo "<pre>" . htmlspecialchars(print_r($array, true)) . "</pre>";
    
    ?>

    Можно сериализовать массив целиком и потом восстановить его. Но если попытаться сериализовать отдельно $array['a'] и $array['b'], а потом их восстановить, то связи будут нарушены.

    Вот пример такого разрушения связей. Для наглядности я добавил элемент массива $array['a']['val'].

    <?php
    
    $array['b'] = array();
    $array['a'] = array('bRef' => &$array['b']);
    $array['b']['aRef'] = &$array['a'];
    $array['a']['val'] = 1;
    
    echo "<pre>" . htmlspecialchars(print_r($array, true)) . "</pre>";
    
    $str_a = serialize($array['a']);
    $str_b = serialize($array['b']);
    
    echo "<pre>" . htmlspecialchars($str_a) . "</pre>";
    echo "<pre>" . htmlspecialchars($str_b) . "</pre>";
    
    $array2['a'] = unserialize($str_a);
    $array2['b'] = unserialize($str_b);
    $array2['a']['val'] = 2;
    
    echo "<pre>" . htmlspecialchars(print_r($array2, true)) . "</pre>";
    
    ?>

    Аналогично выглядит проблема ссылок в объектах. Как раз такой случай описан здесь.

  2. Объекты и их классы.

    Можно сериализовать любой объект, сохранить его в хранилище и в следующий раз изъять и восстановить. В отличие от массивов объекты помимо данных содержат информацию о своем классе, методы и прочую "нагрузку". Особенность сериализации в том, что сохраняется только состояние объекта - его данные, а для "оживления" обязательно заранее должен быть объявлен класс.

    Выходов из этого положения два: ...

Статью целиком можно прочесть на нашем сайте.


А теперь прощаемся с Вами до следующего выпуска.

                                        С уважением, команда Клуба.




В избранное