• Модуль: 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;
}