+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Насильное и мгновенное выполнение агента при схеме работы "агенты на кроне"

С некоторых пор настоятельно рекомендую переводить выполнение всех агентов на крон. И почты тожею Я ставлю запуск раз в минуту, ничем не отличается практически от выполнения на хите. Чтобы не грузить сервер ежеминутным кроном, я снял впску с кроном за пару сотен рублей, и вешаю туда все wget'ы :) Но пост о другом.

Итак, при такой схеме иногда требуется мгновенное выполнение агента, то есть, в конце данного хита, или, максимум. на следующем. Решается эта проблема так:

1. Добавляем агент:
$ID = CAgent::AddAgent('MyAgent('.$arFields['ID'].', true);', '', 'N', 1);
2. Ниже под ним такой код:
if ($ID) {
   if (!isset($_SESSION['START_AGENT']) || !is_array($_SESSION['START_AGENT'])) {
      $_SESSION['START_AGENT'] = array();
   }
   $_SESSION['START_AGENT'][] = $ID;
}
3. Далее вешаем обработчик на OnEpilog:
public static function OnEpilogHandler() {
   if (isset($_SESSION['START_AGENT']) && !empty($_SESSION['START_AGENT'])) {
      foreach ($_SESSION['START_AGENT'] as $ID) {
         CAgent::ExecuteAgents('AND ID='.intval($ID));
      }
      unset($_SESSION['START_AGENT']);
   }
}

4. Далее нам надо обработать ситуацию с LocalRedirect (единственная (за исключением die) ситуация, которая не позволяет дойти до OnEpilog на текущем хите. Собственно, код тот же самый:
public static function OnLocalRedirectHandler() { 
   if (isset($_SESSION['START_AGENT']) && !empty($_SESSION['START_AGENT'])) {
      foreach ($_SESSION['START_AGENT'] as $ID) {
         CAgent::ExecuteAgents('AND ID='.intval($ID));
      }
      unset($_SESSION['START_AGENT']);
   }
}

Все.

За дополнение спасибо Дмитрию Бану.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA