Наверх

[Console 2.0.4-beta] Циклические запросы в консоли MODX

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

Сегодня вышла новая версия дополнение Console для MODX.

Обновление коснулось возможности отправлять повторные циклические запросы на сервер и выполнять один и тот же код несколько раз — до тех пор, пока все, что вам нужно не будет обработано.

Вот небольшая демонстрация того, как это новшество можно использовать:



Включить этот функционал очень просто. Нужно определить переменную $_SESSION['Console']['completed'] и присвоить ей значение false — тогда консоль будет выполнять скрипт до тех пор, пока значение этой переменной не станет равной true.

Вот код, который выполнялся в видео. Здесь происходит пошаговая обработка ресурсов, причем за один шаг обрабатывается только один ресурс. Такой код поможет вам обработать неограниченное число объектов даже на слабом сервере — нужно только время.
<?php
$q = $modx->newQuery('modResource', array('published' => 0));
$q->limit(1);
if ($resources = $modx->getCollection('modResource', $q)) {
    foreach ($resources as $resource) {
        print "Публикую ресурс <b>".$resource->get('pagetitle')."</b>";
        $resource->set('published', 1);
        $resource->save();
    }
    // Говорим консольке, что обработка еще не завершена
    $_SESSION['Console']['completed'] = false;
} else {
    // Останавливаем обработку
    $_SESSION['Console']['completed'] = true;
    print "Готово";
}
А вот пример посложнее — уже с использованием offset:
<?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('modResource');
$total = $modx->getCount('modResource', $q);
// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);
$resources = $modx->getCollection('modResource', $q);
// Обработка
foreach ($resources as $resource) {
    print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
    sleep(0.5);
}
// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
} 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 '_';
    }
}
print "\n";
print $sucsess.'% ('.$_SESSION['console_offset'].')'."\n\n";
Единственный нюанс в том, что код можно продолжать редактировать по ходу выполнения скрипта. Но я еще не определился — баг это или фича)

Источник: modxclub.ru/topics/console-2.0.3-beta-cziklicheskie-zaprosyi-v-konsoli-modx-1695.html


5 комментариев

  1. Дмитрий 27 августа 2015, 09:52 # 0
    Илья, вот у тебя результат попеременно выводится по мере выполнения скрипта, это из-за этих сессий? Я в них ничего не понимаю, но мне нужно чтобы также информация выводилась в каждом цикле foreach
    1. Илья Уткин 27 августа 2015, 10:49 # 0
      Эм… так просто не объяснишь… Если бы ты пример кода дал, я, может, посмотрел бы…
    2. Дмитрий 27 августа 2015, 10:57 # 0
      Вот как-то так:
      <?php
      # строки из csv файла добавляются в таблицу
      foreach ( $parse_csv as $rows => $colums ) {
        
        // Insert columns.
        $columns = array(
          'col1',
          'col2'
        );
         
        //еще много кода
      
        // Insert values.
        $values = array
        ( 
          mb_convert_encoding($colums[0], "utf-8", "windows-1251"),//proizvd
          mb_convert_encoding($colums[1], "utf-8", "windows-1251"),//series
        );
         
        $object = $modx->newObject('Cartridges');
      
        foreach(array_combine($columns, $values) as $col => $val) {
          $object->set($col, $val);
        }
        
        $object->save(); 
      }
      Суть такова, проходим по csv файлу и каждую строку заносим в базу, там в цикле также присутствует загрузка файла на сервер по ссылке из csv, вот это и занимает много времени, поэтому мне нужно чтобы был виден процесс
      1. Илья Уткин 27 августа 2015, 11:05 # +1
        А ты можешь каждый раз обработанную строчку удалять из CSV-файла?

        Если да, тогда можно в конце основного foreach вставить break, чтобы за один раз обрабатывалась только одна строка. А в самом конце проверять, осталось ли еще что-то в CSV-файле, и если да, то указывать
        $_SESSION['Console']['completed'] = false;
        а если нет — то завершаем работу
        $_SESSION['Console']['completed'] = true;
        print "Готово";
      2. Дмитрий Кондаков 27 августа 2015, 11:11 # 0
        Нет, удалять не могу, но суть я понял, дело в этих самых сессиях) Думаю можно реализовать это используя как-то переменную с количеством строк и номер нынешней обрабатываемой строки, сверять их и устанавливать сессию. Сейчас попробую нашаманить

        Авторизация

        через сервис Loginza:


        Шаблоны MODX

        1 2 Дальше »

        Объектная
        модель
        MODX