• Модуль: controller
  • Путь к файлу: ~/bitrix/modules/controller/classes/general/controllermember.php
  • Класс: CAllControllerMember
  • Вызов: CAllControllerMember::UpdateCounters
static function UpdateCounters($member_id, $task_id = false)
{
	/** @global CMain $APPLICATION */
	global $APPLICATION;
	global $DB;
	$member_id = intval($member_id);

	$lockIdSql = $DB->ForSQL("X".$APPLICATION->GetServerUniqID()."_update_counters_".$member_id);
	$DB->Query("SELECT GET_LOCK('".$lockIdSql."', -1) as L");

	$arMember = CControllerMember::GetMember($member_id);
	if(!$arMember)
	{
		$e = new CApplicationException("Member #".$member_id." is not found.");
		$APPLICATION->ThrowException($e);
		$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
		return false;
	}

	$dbr_group = CControllerGroup::GetList(array(), array("=ID" => $arMember["CONTROLLER_GROUP_ID"]), array("UF_*"));
	if(!$ar_group = $dbr_group->Fetch())
	{
		$e = new CApplicationException("Group #".$arMember["CONTROLLER_GROUP_ID"]." is not found.");
		$APPLICATION->ThrowException($e);
		$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
		return false;
	}

	$strCommand = "echo 'DATE_FORMAT='.urlencode(CSite::GetDateFormat()).'&';n";
	if($ar_group["CHECK_COUNTER_FREE_SPACE"] == "Y")
	{
		$strCommand .= "function counter_free_space($APPLICATION, $USER, $DB) {n";
		$strCommand .= "  $quota = new CDiskQuota();n";
		$strCommand .= "  $disk_quota = $quota->GetDiskQuota();n";
		$strCommand .= "  if(is_bool($disk_quota))n";
		$strCommand .= "    return -1;n";
		$strCommand .= "  elsen";
		$strCommand .= "    return round($disk_quota/1024, 2);n";
		$strCommand .= "}n";
		$strCommand .= "echo 'COUNTER_FREE_SPACE='.urlencode(counter_free_space($APPLICATION, $USER, $DB)).'&';n";
	}
	if($ar_group["CHECK_COUNTER_SITES"] == "Y")
	{
		$strCommand .= "function counter_sites($APPLICATION, $USER, $DB) {n";
		$strCommand .= "  $by = 'sort';n";
		$strCommand .= "  $order = 'asc';n";
		$strCommand .= "  $dbr = CSite::GetList($by, $order, array('ACTIVE'=>'Y'));n";
		$strCommand .= "  return $dbr->SelectedRowsCount();n";
		$strCommand .= "}n";
		$strCommand .= "echo 'COUNTER_SITES='.urlencode(counter_sites($APPLICATION, $USER, $DB)).'&';n";
	}
	if($ar_group["CHECK_COUNTER_USERS"] == "Y")
	{
		$strCommand .= "function counter_users($APPLICATION, $USER, $DB) {n";
		$strCommand .= "  $dbr = $DB->Query("SELECT COUNT(1) as USER_COUNT FROM b_user U WHERE (U.EXTERNAL_AUTH_ID IS NULL OR U.EXTERNAL_AUTH_ID='')");n";
		$strCommand .= "  $ar = $dbr->Fetch();n";
		$strCommand .= "  return $ar['USER_COUNT'];n";
		$strCommand .= "}n";
		$strCommand .= "echo 'COUNTER_USERS='.urlencode(counter_users($APPLICATION, $USER, $DB)).'&';n";
	}
	if($ar_group["CHECK_COUNTER_LAST_AUTH"] == "Y")
	{
		$strCommand .= "function counter_last_auth($APPLICATION, $USER, $DB) {n";
		$strCommand .= "  $dbr = $DB->Query("SELECT MAX(U.LAST_LOGIN) as LAST_LOGIN FROM b_user U");n";
		$strCommand .= "  $ar = $dbr->Fetch();n";
		$strCommand .= "  return $ar['LAST_LOGIN'];n";
		$strCommand .= "}n";
		$strCommand .= "echo 'COUNTER_LAST_AUTH='.urlencode(counter_last_auth($APPLICATION, $USER, $DB)).'&';n";
	}
	$rsCounters = CControllerCounter::GetMemberCounters($member_id);
	while($arCounter = $rsCounters->Fetch())
	{
		$strCommand .= "function counter_".$arCounter['ID']."($APPLICATION, $USER, $DB) {n";
		$strCommand .= "  return eval("".EscapePHPString($arCounter["COMMAND"])."");n";
		$strCommand .= "}n";
		$strCommand .= "echo '".$arCounter['ID']."='.urlencode(counter_".$arCounter['ID']."($APPLICATION, $USER, $DB)).'&';n";
	}

	foreach(GetModuleEvents("controller", "OnBeforeUpdateCounters", true) as $arEvent)
	{
		ExecuteModuleEventEx($arEvent, array($arMember, $ar_group, &$strCommand));
	}

	$command_result = CControllerMember::RunCommand($member_id, $strCommand, array(), $task_id, 'run_immediate');
	if($command_result===false)
	{
		$e = $APPLICATION->GetException();
		if(!is_object($e))
		{
			$e = new CApplicationException("Command execution error.");
			$APPLICATION->ThrowException($e);
		}
		$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
		return false;
	}

	$ar_command_result = array();
	parse_str($command_result, $ar_command_result);

	//Try to guess encoding and convert to controller site charset
	foreach($ar_command_result as $k => $v)
		$ar_command_result[$k] = CUtil::ConvertToLangCharset($v);

	$arFields = array(
		"TIMESTAMP" => $arMember["TIMESTAMP_X"],
		"~COUNTERS_UPDATED" => $DB->CurrentTimeFunction(),
	);
	if(array_key_exists('COUNTER_FREE_SPACE', $ar_command_result))
		$arFields['COUNTER_FREE_SPACE'] = intval($ar_command_result['COUNTER_FREE_SPACE']);
	if(array_key_exists('COUNTER_SITES', $ar_command_result))
		$arFields['COUNTER_SITES'] = intval($ar_command_result['COUNTER_SITES']);
	if(array_key_exists('COUNTER_USERS', $ar_command_result))
		$arFields['COUNTER_USERS'] = intval($ar_command_result['COUNTER_USERS']);
	if(array_key_exists('COUNTER_LAST_AUTH', $ar_command_result))
		$arFields['COUNTER_LAST_AUTH'] = $DB->FormatDate($ar_command_result['COUNTER_LAST_AUTH'], 'YYYY-MM-DD HH:MI:SS', CSite::GetDateFormat());

	if(!CControllerMember::Update($member_id, $arFields))
	{
		$e = $APPLICATION->GetException();
		$e = new CApplicationException(GetMessage("CTRLR_MEM_COUNTERS_ERR1").$e->GetString());
		$APPLICATION->ThrowException($e);
		$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
		return false;
	}

	CControllerCounter::UpdateMemberValues($member_id, $ar_command_result);

	$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
	return $arFields;
}