• Модуль: controller
  • Путь к файлу: ~/bitrix/modules/controller/classes/general/controllertask.php
  • Класс: CControllerTask
  • Вызов: CControllerTask::ProcessTask
static function ProcessTask($ID)
{
	/** @global CMain $APPLICATION */
	global $APPLICATION;
	/** @global CDatabase $DB */
	global $DB;

	$ID = intval($ID);
	$lockId = "X".$APPLICATION->GetServerUniqID()."_ctask_".$ID;
	$STATUS = "0";

	// locking the task
	if (!CControllerAgent::_Lock($lockId))
	{
		$APPLICATION->ResetException();
		return $STATUS;
	}

	// selecting task
	$strSql =
		"SELECT T.*, M.SHARED_KERNEL ".
		"FROM b_controller_task T LEFT JOIN b_controller_member M ON T.CONTROLLER_MEMBER_ID=M.ID ".
		"WHERE T.ID='".$ID."' AND T.STATUS<>'Y'";

	$db_task = $DB->Query($strSql);
	if ($ar_task = $db_task->Fetch())
	{
		$arControllerLog = array(
			'CONTROLLER_MEMBER_ID' => $ar_task["CONTROLLER_MEMBER_ID"],
			'TASK_ID' => $ar_task['ID'],
			'STATUS' => 'Y',
		);
		$RESULT = '';
		$STATUS = 'Y';
		unset($INIT_EXECUTE_PARAMS);
		$APPLICATION->ResetException();
		switch($ar_task['TASK_ID'])
		{
		case 'SET_SETTINGS':
			$arControllerLog['NAME'] = 'SET_SETTINGS';
			$res = CControllerMember::SetGroupSettings($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']);
			if ($res === false)
			{
				$e = $APPLICATION->GetException();
				$STATUS = "F";
				$RESULT = $e->GetString();
				$arControllerLog['STATUS'] = 'N';
			}
			else
			{
				$RESULT = $res;
			}

			break;
		case 'CLOSE_MEMBER':
			$arControllerLog['NAME'] = 'SITE_CLOSING';
			$res = CControllerMember::CloseMember($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID']);
			if ($res === false)
			{
				$STATUS = "F";
				$e = $APPLICATION->GetException();
				if ($e)
					$RESULT = $e->GetString();
			}
			else
			{
				$RESULT = $res;
			}

			break;
		case 'UPDATE':
			$arControllerLog['NAME'] = 'SITE_UPDATE';
			if($ar_task["SHARED_KERNEL"] == "Y")
			{
				$STATUS = "F";
				$RESULT = GetMessage("CTRLR_TASK_ERR_KERNEL");
				$arControllerLog['STATUS'] = 'N';
			}
			else
			{
				$command = 'require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php");';
				if($ar_task["STATUS"]=="P" && $ar_task["INIT_EXECUTE_PARAMS"] <> '')
					$command .= 'echo trim(CUpdateControllerSupport::Update("'.EscapePHPString($ar_task["INIT_EXECUTE_PARAMS"]).'"));';
				else
					$command .= 'echo trim(CUpdateControllerSupport::Update(""));';

				$res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $command, array(), $ar_task['ID']);
				if($res!==false)
				{
					if(($p = mb_strpos($res, "|"))>0)
					{
						$result_code = mb_substr($res, 0, $p);
						$RESULT = mb_substr($res, $p + 1);
					}
					else
					{
						$result_code = $res;
						$RESULT = $res;
					}

					if($result_code=='ERR')
					{
						$STATUS = "F";
						$arControllerLog['STATUS'] = 'N';
					}
					elseif($result_code=='STP0') // STP
					{
						$STATUS = "P";
					}
					elseif($result_code!='FIN') // other command
					{
						$STATUS = "P";
						$INIT_EXECUTE_PARAMS = $result_code;
					}
					else
					{
						$RESULT = GetMessage("CTRLR_TASK_UPD_COMPL");
					}
				}
				else
				{
					$STATUS = "F";
					$e = $APPLICATION->GetException();
					$RESULT = $e->GetString();
					$arControllerLog['STATUS'] = 'N';
				}
			}

			break;
		case 'COUNTERS_UPDATE':
			$arControllerLog['NAME'] = 'UPDATE_COUNTERS';
			$res = CControllerMember::UpdateCounters($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']);
			$RESULT = '';
			if($res!==false)
			{
				foreach($res as $k=>$v)
					$RESULT .= "$k=$v;rn";
			}
			else
			{
				$e = $APPLICATION->GetException();
				$STATUS = "F";
				$RESULT = $e->GetString();
				$arControllerLog['STATUS'] = 'N';
			}

			break;
		case 'REMOTE_COMMAND':
			$arControllerLog['NAME'] = 'REMOTE_COMMAND';
			if($ar_task['INIT_EXECUTE_PARAMS'] <> '')
				$ar_task['INIT_EXECUTE_PARAMS'] = unserialize($ar_task['INIT_EXECUTE_PARAMS'], ["allowed_classes" => false]);
			else
				$ar_task['INIT_EXECUTE_PARAMS'] = Array();

			//Command was saved in another task record (for db size optimization)
			if ($ar_task['INIT_EXECUTE'] === ''.intval($ar_task['INIT_EXECUTE']).'')
			{
				if($source_task = static::GetArrayByID($ar_task['INIT_EXECUTE']))
				{
					$ar_task['INIT_EXECUTE'] = $source_task['INIT_EXECUTE'];
				}
				else
				{
					$STATUS = "F";
					$RESULT = "Task ID ".intval($ar_task['INIT_EXECUTE'])." not found.";
					$arControllerLog['STATUS'] = 'N';
					break;
				}
			}

			$res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE'], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID'], 'run_immediate');
			if ($res !== false)
			{
				$RESULT = $res;
			}
			else
			{
				$STATUS = "F";
				$e = $APPLICATION->GetException();
				$RESULT = $e->GetString();
				$arControllerLog['STATUS'] = 'N';
			}

			break;
		case 'SEND_FILE':
			$arControllerLog['NAME'] = 'SEND_FILE';

			break;
		}

		if(!isset($arControllerLog['DESCRIPTION']))
			$arControllerLog['DESCRIPTION'] = $RESULT;

		CControllerLog::Add($arControllerLog);

		// updating status
		$arUpdateFields = array(
			"STATUS" => $STATUS,
			"~DATE_EXECUTE" => $DB->CurrentTimeFunction(),
			"RESULT_EXECUTE" => $RESULT,
			"INDEX_SALT" => rand(),
		);
		if(isset($INIT_EXECUTE_PARAMS))
			$arUpdateFields["INIT_EXECUTE_PARAMS"] = $INIT_EXECUTE_PARAMS;

		$arUpdateBinds = array();
		$strUpdate = $DB->PrepareUpdateBind("b_controller_task", $arUpdateFields, "", false, $arUpdateBinds);

		$strSql = "UPDATE b_controller_task SET ".$strUpdate." WHERE ID=".$ID;

		$arBinds = array();
		foreach($arUpdateBinds as $field_id)
			$arBinds[$field_id] = $arUpdateFields[$field_id];

		$DB->QueryBind($strSql, $arBinds);
	}

	// unlocking
	CControllerAgent::_UnLock($lockId);
	return $STATUS;
}