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