- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/session/handlers/memcachesessionhandler.php
- Класс: BitrixMainSessionHandlersMemcacheSessionHandler
- Вызов: MemcacheSessionHandler::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->add($sid . $sessionId . ".lock", $lock, 0, $lockTimeout))
{
if ($this->connection->increment($sid . $sessionId . ".lock", 1) === 1)
{
$this->connection->replace($sid . $sessionId . ".lock", $lock, 0, $lockTimeout);
break;
}
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;
}
}
return true;
}