331  /  382
Справочник

Работа с сессиями

Просмотров: 40082
Дата последнего изменения: 05.07.2022
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Продукт допускает работу с сессиями следующим образом:

Хранение сессий в memcached

Для включения хранения сессий в memcached в старом ядре необходимо в файле /bitrix/php_interface/dbconn.php установить следующие константы:

define('BX_SECURITY_SESSION_MEMCACHE_HOST', 'localhost');
define('BX_SECURITY_SESSION_MEMCACHE_PORT', 11211);

Либо, в случае использования unix-socket:

define('BX_SECURITY_SESSION_MEMCACHE_HOST', 'unix:///path/to/memcached.sock');
define('BX_SECURITY_SESSION_MEMCACHE_PORT', 0);

После этого, включить в файле bitrix/.settings.php Ядро поддерживает четыре варианта для хранения (файлы, redis, database, memcache) данных сессии. Способ хранения описывается в bitrix/.settings.php в секции 'session'.

Подробнее ...
хранение сессий в базе данных средствами ядра.

Данный способ хранения сессий дает следующие преимущества:

  • нет необходимости следить за количеством старых сессий на нагруженном проекте;
  • возможность разделять сессии между серверами в кластере;
  • возможность использовать не ожидающую получения блокировки сессию;
  • возможность использовать виртуальные сессии.

Хранение сессий в БД имеет те же преимущества что и хранение сессий в memcached, но оно значительно более медленное. Поэтому рекомендуем для этой цели использовать memcached взамен БД.

Неблокирующие сессии

Одной из проблем больших проектов с множественными Ajax запросами, является частые блокировки хитов одного пользователя на ожидание получения блокировки сессии. Особенно это актуально для "Битрикс24 в коробке", где во многих местах прикрепленные к сущностям файлы отдаются пользователю, после проверки прав на PHP. Поэтому на страницах возможно построение "лесенки", из-за ожидания получения блокировки сессии. Включить не блокирующую сессию можно установкой константы, до подключения ядра продукта:

define('BX_SECURITY_SESSION_READONLY', true);

После этого сессия читается из memcached или БД не ожидая получения блокировки. Внутри продукта данная функциональность используется например при отдаче файлов.

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

Виртуальные сессии

Неблокирующих сессий достаточно для большинства случаев. Но в некоторых ситуациях, когда сессия нам не нужна совсем, использование неблокирующей сессии - избыточно, так как сессия будет создаваться в случае ее отсутствия. В результате при большом количестве не связанных между собой хитов, будет создано большое количество "мусорных" сессий. Примером таких хитов, являются хиты REST'а.

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

define('BX_SECURITY_SESSION_VIRTUAL', true);

Особо стоит обратить внимание на то, что данный тип сессии никак не сохраняется. В продукте используется при обработке rest запросов.



Примечание: Если у вас "Битрикс24 в коробке", проект с большим количеством ajax запросов или много файлов отдается с проверкой прав (например в блогах, соцсети, форуме), то лучше использовать хранение сессий в memcached средствами ядра.


Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии