• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/session/handlers/redissessionhandler.php
  • Класс: BitrixMainSessionHandlersRedisSessionHandler
  • Вызов: RedisSessionHandler::lock
protected function lock($sessionId): bool
{
	$sid = $this->getPrefix();
	$lockTimeout = 55;//TODO: add setting
	$lockWait = 59000000;//micro seconds = 60 seconds TODO: add setting
	$waitStep = 100;

	$lock = 1;
	if ($this->exclusiveLock)
	{
		$lock = Context::getCurrent()->getRequest()->getRequestedPage();
	}

	while (!$this->connection->setnx($sid . $sessionId . ".lock", $lock))
	{
		usleep($waitStep);
		$lockWait -= $waitStep;
		if ($lockWait < 0)
		{
			$errorText = '';
			if ($lock !== 1)
			{
				$lockedUri = $this->connection->get($sid . $sessionId . ".lock");
				if ($lockedUri && $lockedUri != 1)
				{
					$errorText .= sprintf(' Locked by "%s".', $lockedUri);
				}
			}

			$this->triggerLockFatalError($errorText);
		}

		if ($waitStep < 1000000)
		{
			$waitStep *= 2;
		}
	}
	$this->connection->expire($sid . $sessionId . ".lock", $lockTimeout);

	return true;
}