Пошаговая работа скрипта в Console

Здравствуйте, необходимо выполнить данный скрипт
$q = $modx->newQuery('msProduct');
$q->where(array('parent' => '9'));
$col = $modx->getCollection('msProduct', $q);
foreach ($col as $item){
    $oe_number = $item->get('oe_number');
    $article = $item->get('article');
    $old_price = $item->get('old_price');
    $price = $old_price * 1.2;
    $item->set('price', $price);
    if (empty($oe_number)) {
      $item->set('oe_number', $article);
    }
    $item->save();
}
Но так как товаров порядка 30 000, то нужно разбить на пошаговое выполнение, нашел данную шпаргалку — ilyaut.ru/cheats/step-by-step-the-script-in-console/, но мозгов доделать не хватает, вот что получилось

<?php
// Сколько ресурсов обрабатывать за раз
$step = 1;
// Если процесс уже остановлен, сбрасываем OFFSET
if (!isset($_SESSION['Console']['completed'])) {
    $_SESSION['console_offset'] = 0;
}
$offset = isset($_SESSION['console_offset']) && $_SESSION['console_offset'] ? $_SESSION['console_offset'] : 0;

// Формируем запрос

$q = $modx->newQuery('msProduct');
$q->where(array('parent' => '9'));
$total = $modx->getCount('msProduct', $q);

// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);
$resources = $modx->getCollection('msProduct', $q);

// Обработка
foreach ($resources as $resource){
  $oe_number = $resource->get('oe_number');
  $article = $resource->get('article');
  $old_price = $resource->get('old_price');
  $price = $old_price * 1.2;
  $resource->set('price', $price);
  if (empty($oe_number)) {
    $resource->set('oe_number', $article);
  }
  $resource->save();
  print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
}

// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['console_offset']);
} else {
  $sucsess = round($_SESSION['console_offset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
$current = isset($_SESSION['console_offset']) ?
           $_SESSION['console_offset'] :
           ($sucsess == 100 ? $total : 0);
print "\n";
print $sucsess.'% ('.$current.')'."\n\n";
Подскажите, как правильно написать пошаговое выполнение скрипта
Максим
03 апреля 2020, 20:59
modx.pro
1
1 228
0

Комментарии: 7

Александр Туниеков
04 апреля 2020, 16:05
0
Вроде правильно скрипт написан… А что не получается?
    Максим
    04 апреля 2020, 20:44
    0


    В общем Loading… постоянно
    Я так понимаю должен быть статусбар выполнения
    Сергей Шлоков
    04 апреля 2020, 22:10
    0
    Есть ещё такой вариант.
      Максим
      04 апреля 2020, 23:13
      0
      В общем перекинул сайт на timeweb, запустил скрипт и всё заработало.

      Основной же сайт на masterhost, если есть идеи в чем проблема на хостинге, подскажите, завтра буду звонить в поддержку, нужно это им как-то донести, чтобы пофиксили)
        Александр Туниеков
        05 апреля 2020, 01:39
        0
        Не понятно в чем проблема на хостинге. Ты бы хотя бы консоль разработчика chrome открыл и посмотрел какие запросы и ответы идут при запуске скрипта.
        Максим
        07 апреля 2020, 09:39
        0
        Проблема была в mod_security, проверить включен ли он можно через
        <?php
            phpinfo();
        ?>
        Если включен, то нужно попросить хостера выключить
          Александр Мельник
          03 апреля 2023, 20:03
          0
          php консоль в modx имеет свои секреты или это я не понимаю простых вещей?
          Подскажите пожалуйста, почему код приведенный выше работает?
          Мы задаем количество, задаем сдвиг. Делаем выборку чего либо, получаем массив объектов.
          Иттерируемся по этим объектам, выполняем какую то логику.
          Когда цикл завершился мы высчитываем новый сдвиг, дополнительно в цикле визуализируем «прогрессбар» НО что заставляет скрипт запустится снова? Почему происходит получение новых объектов и снова запускается цикл?
          В моем понимании этот скрипт (конкретно тот что в заметке) должен отработать ровно 1 ресурс (поскольку step=1) и умереть.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            7