CodeIgniter, руководство пользователя к версии 1.6.1


Класс для работы с сессиями

Класc Session позволяет вам хранить информацию о пользователе и отслеживать его активность пока он находятся на вашем сайте. Класс Session хранит информацию о каждом пользователе как упорядоченную(при необходимости зашифрованную) информацию в cookies. Так же он может сохранять информацию в таблице базы данных - для дополнительной безопасности, это позволяет сопоставлять идентификатор сессии сохраненный в кукисах с идентификатором сохраненным в базе данных. По умолчанию информация сохраняется лишь в cookies. Если вы захотите использовать базу данных для хранения информации о сессии, то вам будет необходимо создать таблицу как указано ниже.

Примечание: Класс Session не использует родные PHP сессии. Он генерирует свои специфические данные, что позволяет разработчикам получить более гибкие возможности.

Создание сессии

Класс Session, как правило, необходим на каждой странице, так что он должен быть инициализирован в конструкторе вашего контроллера, либо автоматически подключаться с помощью application/config/autoload.php.

Для того чтобы инициализировать класс Session вручную в конструкторе вашего контроллера используйте функцию $this->load->library:

$this->load->library('session');

После загрузки объект класс Session станет доступным: $this->session

Как работает класc Session ?

Когда страница загружена класс Session проверит - есть ли в cookies пользователя корректные на данный момент данные сессии. Если данных нет(или они устарели) то будет создана новая сессия, которая будет сохранена в cookies. Если сессия существует, то информация о ней будет обновлена, соответственно cookies тоже будет обновлены. С каждым обновлением session_id будет заменятся на вновь сгенерированный session_id.

Важно понять, что будучи инициализированным класс Session далее работает самостоятельно. Нет ничего, что вам предстоит сделать для того чтобы он работал. Вы сможете работать с данными сессии, или даже добавлять собственные данные в сессию пользователя, однако процесс чтения, записи и обновления сессии является автоматическим.

Что такое данные сессии?

Сессия является массивом содержащим следующую информацию::

Вся эта информация хранится в cookies как упорядоченный массив, соответствующий этому примеру:

[array]
(
     'session_id'    => random hash,
     'ip_address'    => 'string - user IP address',
     'user_agent'    => 'string - user agent data',
     'last_activity' => timestamp
)

Если вы используете возможность шифрования данных сессии, то массив будет сначала зашифрован, а затем сохранен в cookies пользователя. Это повышает безопасность хранения информации и делает невозможным ее чтение либо изменение третьими лицами. Больше про шифрование вы можете найти здесь, класс Session производит шифрование данных автоматически.

Примечание: Чтобы снизить нагрузку на процессор, по умолчанию cookies обновляются каждые 5 минут. Если вы часто обновляете страницу, то можете заметить, что время последней активности обновляется только тогда, когда пройдет около пяти минут, с того времени как cookies были записаны в прошлый раз. Это время можно регулировать, изменяя параметр $config['time_to_update'] в файле system/config/config.php

Получение данных сессии

Любой элемент массива сессии становится доступным с помощью следующей функции:

$this->session->userdata('item');

Где item является индексом массива сессии. Например, для того чтобы получить ID сессии необходимо сделать так:

$session_id = $this->session->userdata('session_id');

Примечание: Функция возвращает FALSE если параметра который вы пытаетесь получить не существует.

Добавление данных в сессию

Сессии позволяют сохранять собственную информацию в cookies пользователя. Зачем это нужно? Вот пример:

Допустим, что пользователь залогинился на вашем сайте. После авторизации вы можете добавить его username и email в cookies сессии, что сделает эту информацию доступной везде - без необходимости подключения к базе данных.

Для того чтобы добавить информацию в массив сессии необходимо передать собственный массив(массив с новой информацией) в эту функцию:

$this->session->set_userdata($array);

Где $array является ассоциативным массивом, который содержит вашу новую информацию. Пример:

$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );

$this->session->set_userdata($newdata);

Если вам необходимо добавить одно значение, то вы можете воспользоваться следующим синтаксисом функции set_userdata():

$this->session->set_userdata('some_name', 'some_value');

Примечание: cookies могут содержать только 4kb информации, следите за тем чтобы не превысить этот объем. Зашифрованная информация занимает больше места чем не зашифрованная.

Удаление данных сессии

Так же как set_userdata() может быть использована для добавления информации в сессию, unset_userdata() может быть использована для удаления этой информации. Например, если вы хотите удалить 'some_name' из вашей сессии:

$this->session->unset_userdata('some_name');

Эта функция так же поддерживает ассоциативный массив элементов, которые необходимо удалить:

$array_items = array('username' => '', 'email' => '');

$this->session->unset_userdata($array_items);

Flashdata

CodeIgniter поддерживает "flashdata", эта возможность позволяет сделать данные сессии доступными только для следующего запроса сервера, а после этого они будет автоматически удалены. Эта возможность может оказаться очень полезной, чаще всего ее используют для хранения статусных сообщений(например: "запись 2 удалена").

Примечание: Flash данные начинаются с префикса "flash_", так что избегайте его в именах своих собственных данных.

Для того чтобы добавить flashdata необходимо:

$this->session->set_flashdata('item', 'value');

Вы можете передать массив в качестве параметра set_flashdata(), это выглядит так же как и с функцией set_userdata().

Для того чтобы прочесть переменную flashdata необходимо:

$this->session->flashdata('item');

Если вам необходимо сохранить flashdata переменную, т.е. сохранить ее на еще один запрос сервера, вы можете сделать это с помощью функции keep_flashdata():

$this->session->keep_flashdata('item');

Сохранение данных о сессии в базу данных

Пока информация хранящаяся в cookies пользователя содержит ID сессии, вы не имеете возможности проверить его, в отличие от варианта когда данные сессии хранятся в базе данных. Для приложений, которые не требуют высокого уровня безопасности, проверка ID сессии не является обязательной, однако, если ваше приложение требует высокого уровня безопасности, то проверка становится обязательной.

Если данные сессии находятся в базе данных, то каждый раз, когда в cookies пользователя обнаруживается рабочая сессия, осуществляется запрос к базе данных - с целью сравнить ID сессий. Если ID сессии не совпадают, то сессия разрушается. ID сессии никогда не обновляется, он может быть лишь сгенерированным, когда сессия создается.

Если вы хотите размещать сессии в базе данных, то сперва необходимо создать таблицу для этих целей. Ниже приведен простейший пример для субд mysql:

Примечание: по умолчанию таблица называется ci_sessions, однако вы можете назвать ее как захотите - для этого необходимо изменить файл application/config/config.php. После того как вы создали таблицу вы можете активировать возможность сохранения данных сессии в базе данных в вашем config.php:

$config['sess_use_database'] = TRUE;

После того как эта возможность активирована, класс Session будет размещать данные в базе данных.

Убедитесь, что вы правильно указали название таблицы в файле конфигурации:

$config['sess_table_name'] = 'ci_sessions";

Примечание: Класс Session содержит встроенный чистильщик мусора, который удаляет истекшие сессии, так что у вас нет необходимости писать собственный.

Уничтожение сессий

Для того чтобы очистить текущую сессию:

$this->session->sess_destroy();

Примечание: Эта функция должна вызываться последней, после ее вызова даже flash переменные становятся не доступными. Если вам необходимо уничтожить лишь некоторые переменные, то воспользуйтесь unset_userdata().

Настройка класса Session

Все ниже представленные настройки содержатся в файле application/config/config.php:

Значение По умолчанию Варианты Описание
sess_cookie_name ci_session Нет Имя cookies куда будет сохранятся сессия.
sess_expiration 7200 Нет Количество секунд по прошествии которых сессия считается истекшей. Значение по умолчанию 2 часа. Ели вы ходите чтобы ваша сессия была бесконечной, то выставляйте значение 0.
sess_encrypt_cookie FALSE TRUE/FALSE (boolean) Шифровать ли информацию сессии?
sess_use_database FALSE TRUE/FALSE (boolean) Размещать ли информацию о сессии в базе данных? (Вы должны создать таблицу до того как активируете эту опцию).
sess_table_name ci_sessions Любое SQL-корректное имя таблицы Имя таблицы где будет хранится информация о сессиях.
sess_time_to_update 300 Время в секундах Опция отвечает за то как часто класс Session будет регенирировать ID сессии.
sess_match_ip FALSE TRUE/FALSE (boolean) Сверять ли IP пользователя, во время чтения данных сессии? (Обратите внимание, что некоторые интернет провайдеры динамически меняют IP. Так что если вы хотите использовать бесконечные сессии, то выставьте данную опцию в значение FALSE)
sess_match_useragent TRUE TRUE/FALSE (boolean) Сверять ли User Agent во время чтения данных сессии?