Статьи 1С-Битрикс

Решил задачу, рассказал об этом

Блокировка сессии Битрикс. Хранение сессии на redis

Блокировка сессии Битрикс. Хранение сессии на redis

Сайт зависает? Возможно проблема в блокировке сессий. Нужно перевести функционал хранения сессий на Redis

По умолчанию битрикс использует хранение сессий в файлах в директории которая указана в директиве session.save_path

Когда пользователь на поиске, в каталоге или в карточке товара, много раз жмет на кнопке ПЛЮС для добавления в корзину, отправляются аякс запросы подряд. На время выполнения запроса, блокируется сессия. И следующий ajax запрос ждет(пытается получить сессию), пока исполнится предыдущий. Если пользователь подряд нажмет 20 раз, улетит 20 запросов подряд - все ждут пока освободится сессия, забиваются все обработчики php и пока сервер не разгребет, сайт зависает.

Все источники в интернете говорят о хранении сессии на Redis - это самое оптимальное решение т.к. он не блокирует сессии. В Битрикс есть настройка для хранения сессий в redis. Для этого в файле .settings.php необходимо заменить блок session на следующий. Соответственно порт и хост нужно прописать свой. Их может выдать ваш хостер

// bitrix/.settings.php
return [
'session' => [
    'value' => [
        'mode' => 'default',
        'handlers' => [
            'general' => [
                'type' => 'redis',
                'port' => '6379',
                'host' => '127.0.0.1',
            ],
        ],
    ],
]

После установки данной настройки необходимо в файле, куда идет много запросов ajax, добавить константу define('BX_SECURITY_SESSION_READONLY', true); до подключения ядра продукта. Но важно помнить, как видно из названия константы, сессия не будет записана на данном хите, а только будет доступна для чтения, где установлена константа

Ошибка noauth authentication required. (0) Битрикс

Если вы получили ошибку noauth authentication required. (0) , это означает что при подключении к серверу redis необходимо ввести пароль. К сожалению битрикс не добавило в свой функционал установку пароля для подключения к redis. Но можно самим допилить функционал Для этого

1. в файле \bitrix/.settings.php в блоке session допишем параметр 'auth' => 'password', где password это ваш пароль от redis
'session' => [
    'value' => [
        'mode' => 'default',
        'handlers' => [
            'general' => [
                'type' => 'redis',
                'port' => '6379',
                'host' => '127.0.0.1',
                'auth' => 'E34ewei94235235aiYoo34F7z',
            ],
        ],
    ],
],
2. в файле \bitrix\modules\main\lib\session\handlers\redissessionhandler.php в конструкторе класса RedisSessionHandler допишем в параметрах подключения 'auth' => $options['auth'] ?? null
$connectionPool->setConnectionParameters(self::SESSION_REDIS_CONNECTION, [
			'className' => RedisConnection::class,
			'host' => $options['host'] ?? '127.0.0.1',
			'port' => (int)($options['port'] ?? 11211),
			'servers' => $options['servers'] ?? [],
			'serializer' => $options['serializer'] ?? null,
			'failover' => $options['failover'] ?? null,
			'timeout' => $options['timeout'] ?? null,
			'readTimeout' => $options['readTimeout'] ?? null,
			'persistent' => $options['persistent'] ?? null,
			'auth' => $options['auth'] ?? null,
		]);
3. в файле \bitrix\modules\main\lib\data\configurator\redisconnectionconfigurator.php в классе RedisConnectionConfigurator и методе createConnection после соединения $connection->connect($host, $port) добавим строчку $connection->auth($config['auth']);
$result = $connection->connect($host, $port);
$connection->auth($config['auth']);

И все, теперь соединение будет использовать пароль для доступа с redis и ошибка больше появляться не будет. Почему битрикс разработчики не позаботились об этом не понятно. Но при обновлении битрикс, вполне вероятно, что эти изменения перетрутся и их нужно будет внести заново.

Ошибка Undefined class constant 'SERIALIZER_IGBINARY' (0) Битрикс

Эта ошибка возникает после установки redis. Это означает, что phpredis не был скомпилирован с поддержкой IGBINARY.
Для всех, кто столкнулся с этой проблемой, просто переустановите и скажите «да» поддержке igbinary!

Возврат к списку