class MyClassAgent extends CAgent{
public static function OnPageStartHendler(){
if(defined("ADMIN_SECTION") && ADMIN_SECTION ===true){
$res = CAgent::GetList(Array("ID" => "DESC"), array("NAME" => "AgentSmit%"));
$arIdAgent = array();
while($arAgent = $res->Fetch()){
$arIdAgent[] = $arAgent['ID'];
}
if(count($arIdAgent)){
MyClassAgent::CheckAgentsByID($arIdAgent);
}
}
}
function CheckAgentsByID($arIdAgent = array())
{
if(!count($arIdAgent)) return;
global $CACHE_MANAGER;
//For a while agents will execute only on primary cluster group
if((defined("NO_AGENT_CHECK") && NO_AGENT_CHECK===true) || (defined("BX_CLUSTER_GROUP") && BX_CLUSTER_GROUP !== 1))
return null;
$agents_use_crontab = COption::GetOptionString("main", "agents_use_crontab", "N");
$str_crontab = "";
if($agents_use_crontab=="Y" || (defined("BX_CRONTAB_SUPPORT") && BX_CRONTAB_SUPPORT===true))
{
if(defined("BX_CRONTAB") && BX_CRONTAB===true)
$str_crontab = " AND IS_PERIOD='N' ";
else
$str_crontab = " AND IS_PERIOD='Y' ";
}
if(CACHED_b_agent !== false && $CACHE_MANAGER->Read(CACHED_b_agent, ($cache_id = "agents".$str_crontab), "agents"))
{
$saved_time = $CACHE_MANAGER->Get($cache_id);
if(time() < $saved_time)
return "";
}
return MyClassAgent::ExecuteAgents($str_crontab, $arIdAgent);
}
function ExecuteAgents($str_crontab, $arIdAgent = array())
{
if(!count($arIdAgent)) return;
global $DB, $CACHE_MANAGER, $pPERIOD;
if(defined("BX_FORK_AGENTS_AND_EVENTS_FUNCTION"))
{
if(CMain::ForkActions(array("CAgent", "ExecuteAgents"), array($str_crontab)))
return "";
}
$saved_time = 0;
$cache_id = "agents".$str_crontab;
if(CACHED_b_agent !== false && $CACHE_MANAGER->Read(CACHED_b_agent, $cache_id, "agents"))
{
$saved_time = $CACHE_MANAGER->Get($cache_id);
if(time() < $saved_time)
return "";
}
$uniq = CMain::GetServerUniqID();
$strSql = "
SEL ECT 'x'
FR OM b_agent
WHERE
ACTIVE = 'Y'
AND ID IN (" . implode(',', array_map('intval', $arIdAgent)) . ")
LIMIT 1
";
$db_result_agents = $DB->Query($strSql);
if($db_result_agents->Fetch())
{
$db_lock = $DB->Query("SEL ECT GET_LOCK('".$uniq."_agent', 0) as L");
$ar_lock = $db_lock->Fetch();
if($ar_lock["L"]=="0")
return "";
}
else
{
if(CACHED_b_agent !== false)
{
$rs = $DB->Query("SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FR OM b_agent WHERE ACTIVE='Y' ".$str_crontab."");
$ar = $rs->Fetch();
if(!$ar || $ar["DATE_DIFF"] < 0)
$date_diff = 0;
elseif($ar["DATE_DIFF"] > CACHED_b_agent)
$date_diff = CACHED_b_agent;
else
$date_diff = $ar["DATE_DIFF"];
if($saved_time > 0)
{
$CACHE_MANAGER->Clean($cache_id, "agents");
$CACHE_MANAGER->Read(CACHED_b_agent, $cache_id, "agents");
}
$CACHE_MANAGER->Set($cache_id, intval(time()+$date_diff));
}
return "";
}
$strSql=
"SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID ".
"FR OM b_agent ".
"WHERE ACTIVE='Y' ".
" AND ID IN (" . implode(',', array_map('intval', $arIdAgent)) . ") ".
" ORDER BY RUNNING ASC, SORT desc";
$db_result_agents = $DB->Query($strSql);
$ids = '';
$agents_array = array();
while($db_result_agents_array = $db_result_agents->Fetch())
{
$agents_array[] = $db_result_agents_array;
$ids .= ($ids <> ''? ', ':'').$db_result_agents_array["ID"];
}
if($ids <> '')
{
$strSql = "UPD ATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (".$ids.")";
$DB->Query($strSql);
}
$DB->Query("SELECT RELEASE_LOCK('".$uniq."_agent')");
$logFunction = (defined("BX_AGENTS_LOG_FUNCTION") && function_exists(BX_AGENTS_LOG_FUNCTION)? BX_AGENTS_LOG_FUNCTION : false);
for($i = 0, $n = count($agents_array); $i < $n; $i++)
{
$arAgent = $agents_array[$i];
if ($logFunction)
$logFunction($arAgent, "start");
@set_time_limit(0);
ignore_user_abort(true);
if(strlen($arAgent["MODULE_ID"])>0 && $arAgent["MODULE_ID"]!="main")
{
if(!CModule::IncludeModule($arAgent["MODULE_ID"]))
continue;
}
//upd ate the agent to the running state - if it fails it'll go to the end of the list on the next try
$DB->Query("UPDATE b_agent SE T RUNNING='Y' WHERE ID=".$arAgent["ID"]);
//these vars can be assigned within agent code
$pPERIOD = $arAgent["AGENT_INTERVAL"];
CTimeZone::Disable();
global $USER;
unset($USER);
$eval_result = "";
$e = eval("\$eval_result=".$arAgent["NAME"]);
unset($USER);
CTimeZone::Enable();
if ($logFunction)
$logFunction($arAgent, "finish", $eval_result, $e);
if($e === false)
{
continue;
}
elseif(strlen($eval_result)<=0)
{
$strSql = "DELETE FR OM b_agent WH ERE ID=".$arAgent["ID"];
}
else
{
$strSql = "
UPDATE b_agent SE T
NAME='".$DB->ForSQL($eval_result, 2000)."',
LAST_EXEC=now(),
NEXT_EXEC=DATE_ADD(".($arAgent["IS_PERIOD"]=="Y"? "NEXT_EXEC" : "now()").", INTERVAL ".$pPERIOD." SECOND),
DATE_CHECK=NULL,
RUNNING='N'
WH ERE ID=".$arAgent["ID"];
}
$DB->Query($strSql);
}
return null;
}
}
|