Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.0

Search User Guide

# Класс сессий (Session)

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

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

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

## Инициализация сессий

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

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

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

Загруженный объект библиотеки сессий доступен к использованию как $this->session

## Как работают сессии?

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

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

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

Сессии в CodeIgniter это просто массив, содержащий следующую информацию:

- Уникальный идентификатор сессии пользователя (Session ID, статистически случайная строка с очень высокой энтропией, хешированной в MD5 для портативности, и перегенерируемая по умолчанию каждые 5 минут);
- IP-адрес пользователя;
- User Agent пользователя (первые 120 символов браузерной строки);
- Время последней активности (unix timestamp).

Указанные выше данные сохраняются в куки в виде сериализованного массива, в соответствии с этим прототипом:

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

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

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

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

Любой кусок информации из массива сессии возможно получить посредством следующей функции:

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

Где `item` это индекс массива, соответствующий элементу, который вы хотите получить. Например, для того, чтобы взять идентификатор сессии, сделайте следующее:

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

Примечание: Эта фунция возвращает FALSE, если запрошенный элемент не существует.

## Добавление пользовательских данных

Полезный аспект массива сессий заключается в том, что вы можете добавлять ваши собственные данные в него, и они будут сохраняться в пользовательской куке. Зачем это вам? Вот пример:

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

Чтобы добавить ваши данные в массив сессии, передайте этой функции массив, содержащий ваши новые данные:

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

Где `$array` это ассоциативный массив, содержащий ваши новые данные. Вот пример:

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

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

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

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

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

Массив со всеми данными сессии может быть получен следующим образом:

`$this->session->all_userdata()`

Эта функция возвращает ассоциативный массив, вроде следующего:

    Array
    (
        [session_id] => 4a5a5dca22728fb0a84364eeb405b601
        [ip_address] => 127.0.0.1
        [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
        [last_activity] => 1303142623
    )

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

Также, как 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" — данные сессии, которые доступны только для следующего запроса, и затем автоматически удаляются. Это может быть полезно для отображения статусных сообщений.

Примечание: Имена переменных flashdata начинаются на "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');`

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

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

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

Чтобы сохранять сессии, вы должны сперва создать таблицу базы данных. Вот основной прототип (для MySQL), требуемый классом сессий:

CREATE TABLE IF NOT EXISTS `ci_sessions` ( session_id varchar(40) DEFAULT '0' NOT NULL, ip_address varchar(16) DEFAULT '0' NOT NULL, user_agent varchar(120) NOT NULL, last_activity int(10) unsigned DEFAULT 0 NOT NULL, user_data text NOT NULL, PRIMARY KEY (session_id), KEY `last_activity_idx` (`last_activity`) );

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

`$config['sess_use_database'] = TRUE;`

После включения класс сессий будет сохранять данные сессий в БД.

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

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

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

## Удаление сессии

Чтобы очистить текущую сессию:

`$this->session->sess_destroy();`

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

## Параметры сессий

Следующие параметры доступны в вашем конфигурационном файле `application/config/config.php`:

Параметр | Значение по умолчанию | Опции | Описание
--- | --- | --- | ---
sess_cookie_name | ci_session | Нет | Имя, с которым должны сохраняться куки сессии.
sess_expiration | 7200 | Нет | Количество секунд, которые должна существовать сессия. По умолчанию 2 часа (7200 секунд). Если вы хотите создать неистекающие сессии, установите значение в ноль: 0
sess_expire_on_close | FALSE | TRUE/FALSE (boolean) | Объявлять ли сессию истекшей автоматически при закрытии окна браузера.
sess_encrypt_cookie | FALSE | TRUE/FALSE (boolean) | Шифровать ли данные сессий.
sess_use_database | FALSE | TRUE/FALSE (boolean) | Сохранять ли данные сессий в базу данных. Вы должны создать таблицу перед включением этой опции.
sess_table_name | ci_sessions | Any valid SQL table name | Имя таблицы базы данных для сессий.
sess_time_to_update | 300 | Время в секундах | Эта опция определяет, насколько часто класс сессий будут регенерировать себя и создавать новый идентификатор сессии.
sess_match_ip | FALSE | TRUE/FALSE (boolean) | Должен ли совпадать IP-адрес пользователя при считывании данных сессии. Помните, что некоторые ISP динамически изменяют IP, поэтому если вы хотите, чтобы сессии не заканчивались, установите этот параметр в FALSE.
sess_match_useragent | TRUE | TRUE/FALSE (boolean) | Сверять ли User Agent при чтении данных сессии.

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter