11
14.03.201613:2114.03.2016 13:21:26
Возможности работы с сессиями в продукте значительно расширились. Появилась возможность в качестве хранилища сессии использовать memcached, не блокирующая и виртуальная сессия. Остановимся подробнее на этих возможностях.
1. Хранение сессий в memcachedДля включения хранения сессий в memcached необходимо в /bitrix/php_interface/dbconn.php или /local/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); |
После этого, включить в модуле проактивной защиты, хранение сессий в базе данных. В результате получаем хранение сессий в memcached средствами ядра.
Данный способ хранения сессий дает следующие преимущества:
- нет необходимости следить за количеством старых сессий на нагруженном проекте
- возможность разделять сессии между серверами в кластере
- возможность использовать не ожидающую получения блокировки сессию
- возможность использовать виртуальные сессии
В целом хранение сессий в БД имеет такие же преимущества, но в отличие от хранения сессий в memcached, значительно более медленное. Поэтому рекомендуем использовать хранение сессий в memcached, взамен хранения сессий в БД.
2. Не блокирующие сессии. Одной из проблем больших проектов с множественными аякс запросами, является частые блокировки хитов одного пользователя на ожидание получения блокировки сессии. Особенно это актуально для КП, где во многих местах прикрепленные к сущностям файлы отдаются пользователю, после проверки прав на php. Поэтому на страницах возможно построение лесенки, из за ожидания получения блокировки сессии. Включить не блокирующую сессию можно установкой константу, до подключения ядра продукта.
define('BX_SECURITY_SESSION_READONLY', true); |
После этого сессия читается из memcached или БД не ожидая получения блокировки. Важно помнить, что при использование данной константы по завершению хита, сессия не будет записана. Что может привести к потере данных сохраненных в рамках хита в сессии. Внутри продукта данная функциональность используется например при отдаче отдаче файлов.
3. Виртуальные сессии.Не блокирующих сессий, для большинства кейсой достаточно. Но в некоторых ситуациях, когда сессия нам не нужна совсем, использование не блокирующей сессии все таки избыточно. Так как сессия будет создаваться в случае ее отсутствия. В результате при большом количестве не связанных между собой хитов, будет созданно большое количество мусорных сессий. Примером таких хитов, являются хиты реста. Для решения этой проблемы была добавлена "Виртуальная сессия". Суть которой заключается в том, что сессия создается в памяти, не ждет блокировок и не сохраняется. Для ее включения необходимо установить константу, до подключения ядра продукта.
define('BX_SECURITY_SESSION_VIRTUAL', true); |
Особо стоит обратить внимание на то, что данный тип сессии никак не сохраняется. В продукте используется при обработке рест запросов.
В качестве небольшого заключения. Если у вас КП, проект с большим количеством ajax запросов или много файлов отдается с проверкой прав (например в блогах, соцсети, форуме) то лучше использовать хранение сессий в memcached средствами ядра.