Решил задачу, рассказал об этом
Сайт зависает? Возможно проблема в блокировке сессий. Нужно перевести функционал хранения сессий на 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) , это означает что при подключении к серверу 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 и ошибка больше появляться не будет. Почему битрикс разработчики не позаботились об этом не понятно. Но при обновлении битрикс, вполне вероятно, что эти изменения перетрутся и их нужно будет внести заново.
Эта ошибка возникает после установки redis. Это означает, что phpredis не был скомпилирован с поддержкой IGBINARY.
Для всех, кто столкнулся с этой проблемой, просто переустановите и скажите «да» поддержке igbinary!