- Модуль: security
- Путь к файлу: ~/bitrix/modules/security/classes/general/session_mc.php
- Класс: CSecuritySessionMC
- Вызов: CSecuritySessionMC::read
static function read($id)
{
if(!self::isConnected() || !self::isValidId($id))
return "";
$sid = self::getPrefix();
if (!self::$isReadOnly)
{
$lockTimeout = 55;//TODO: add setting
$lockWait = 59000000;//micro seconds = 60 seconds TODO: add setting
$waitStep = 100;
if (defined('BX_SECURITY_SESSION_MEMCACHE_EXLOCK') && BX_SECURITY_SESSION_MEMCACHE_EXLOCK)
$lock = BitrixMainContext::getCurrent()->getRequest()->getRequestedPage();
else
$lock = 1;
while(!self::$connection->add($sid.$id.".lock", $lock, 0, $lockTimeout))
{
if(self::$connection->increment($sid.$id.".lock", 1) === 1)
{
self::$connection->replace($sid.$id.".lock", $lock, 0, $lockTimeout);
break;
}
usleep($waitStep);
$lockWait -= $waitStep;
if($lockWait < 0)
{
$errorText = 'Unable to get session lock within 60 seconds.';
if ($lock !== 1)
{
$lockedUri = self::$connection->get($sid.$id.".lock");
if ($lockedUri && $lockedUri != 1)
$errorText .= sprintf(' Locked by "%s".', $lockedUri);
}
CSecuritySession::triggerFatalError($errorText);
}
if($waitStep < 1000000)
$waitStep *= 2;
}
}
self::$sessionId = $id;
self::$isSessionReady = true;
$res = self::$connection->get($sid.$id);
if($res === false)
{
if (!self::$hasFailedRead)
{
AddEventHandler("main", "OnPageStart", array("CSecuritySession", "UpdateSessID"));
self::$hasFailedRead = true;
}
$res = "";
}
return $res;
}