В классе-обработчике создаем функцию, которая при отсутствии будет создавать новую функцию-агента.
$agent = \CAgent::GetList(array(), array('MODULE_ID' => 'модуль_для_агента', 'NAME' => 'Имя_функции_агента(%);'))->fetch();
if (!is_array($agent) || !isset($agent['ID'])) {
$resId = \CAgent::AddAgent('Имя_функции_агента(0);', 'модуль_для_агента', 'Y', 43200,'','N');
if($resId)
{
$this->agentId = $resId;
$this->step = 0;
}
// every 15 minutes
} else {
preg_match('|Имя_функции_агента\((\d*)\)|si', $agent['NAME'],$matches);
$this->step = intval($matches[1]);
$this->agentId = (int) $agent['ID'];
}
}
Таким образом, в параметра "step" будет шаг, на котором остановился агент. Остается лишь продумать логику, на каком шаге, какой набор операций необходимо выполнить и будет готово.
На первом шаге прописываем начало файла выгрузки. На последнем шаге прописываем завершающие теги выгрузки. На промежуточном этапе прописываем все внутренние данные для выгрузке
На каждой итерации обработки данных обновляем нашего агента:
$now = new DateTime();
$agentTime = [
'LAST_EXEC'=>$now->format('d.m.Y H:i:s'),
'NEXT_EXEC'=>''
];
$now->add('6 hour');
$agentTime['NEXT_EXEC'] = $now->format('d.m.Y H:i:s');
\CAgent::Update($this->agentId, [
'NAME'=>'GoogleFeed::agent('.($this->step+1).');',
'LAST_EXEC'=>$agentTime['LAST_EXEC'],
'NEXT_EXEC'=>$agentTime['NEXT_EXEC']
]);
Таким образом, агент будет обновляться, в него будет помещаться следующий шаг для обработки, а также будут обновляться дата последнего запуска и следующего запуска и можно будет в списке агентов отслеживать корректность отработки агентов.
