Перегенерация всех фото товаров с ошибками

Добрый день.
Пытаюсь перегенерировать все фото товаров сайта (порядка 3000 позиций) через скрипт из документации.
Запускаю через консоль и он во-первых работает очень долго (порядка 12 часов), во-вторых заканчивается множественными ошибками. Вот выдержка из логов:
batyam@oscar1:~/ [0] $ tail -n 20 PHP_errors.log
#2 /core/model/modx/modx.class.php(1764): modProcessor->run()
#3 /core/model/modx/modconnectorresponse.class.php(144): modX->runProcessor('exec', Array, Array)
#4 /core/model/modx/modconnectorrequest.class.php(86): modConnectorResponse->outputContent(Array)
#5 /core/model/modx/modconnectorrequest.class.php(73): modConnectorRequest->prepareResponse(Array)
#6 /manager/components/console/connectors/console.php(11): modConnectorRequest->handleRequest(Array)
#7 {main}
thrown in /core/components/console/processors/exec.class.php(24): eval()'d code on line 14
[23-Jan-2021 06:25:14 UTC] PHP Fatal error: Uncaught Error: Call to a member function get() on null in /core/model/modx/modtemplatevar.class.php:303

Stack trace:
#0 /core/model/modx/modtemplatevar.class.php(284): modTemplateVar->prepareOutput('assets/images/i...', 551)
#1 /core/model/modx/modresource.class.php(939): modTemplateVar->renderOutput(551)
#2 /core/components/pdotools/model/pdotools/_micromodx.php(47): modResource->getTVValue('img_cats')
#3 /core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(487): eval()'d code(642): microMODX->__get('resource')
#4 /core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Fenom\Template->{closure}(Array, Object(Fenom\Template))
#5 /core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Closure->__invoke(Array, Object(Fenom\Template))
#6 /core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(492): Fenom\Render->display(Array)
#7 /core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(229): Fenom\Template->display(Array)
#8 /core/components/pdotools/model/pdotools/pdotools.class.php(580): Fenom\Render->fetch(Array)
#9 /core/components/pdotools/model/pdotools/pdoparser.class.php(61): pdoTools->fenom('{if $_modx->has...', Array)
#10 /home/batyam@oscar1:~/ [0] $
Можете что-то подсказать? Может версия PHP не та (7.4) или еще что-то…
Андрей
01 февраля 2021, 22:04
modx.pro
1
662
0

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

Артур Шевченко
01 февраля 2021, 22:18
0
Код покажите.
    Андрей
    01 февраля 2021, 22:25
    0
    <?php
    define('MODX_API_MODE', true);
    require 'index.php'; // Этот файл лежит в корне сайта
    
    $modx->getService('error','error.modError');
    $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
    $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
    
    // Проходимся по всем товарам
    $products = $modx->getIterator('msProduct', array('class_key' => 'msProduct'));
    foreach ($products as $product) {
        // Получаем оригиналы их картинок
        $files = $product->getMany('Files', array('parent' => 0));
        foreach ($files as $file) {
            // Затем получаем их преью
            $children = $file->getMany('Children');
            foreach ($children as $child) {
                // Удаляем эти превью, вместе с файлами
                $child->remove();
            }
            // И генерируем новые
            $file->generateThumbnails();
    
            // Если это первый файл в галерее - обновляем ссылку на превью товара
            /** @var msProductData $data */
            if ($file->get('rank') == 0 && $data = $product->getOne('Data')) {
                $thumb = $file->getFirstThumbnail();
                $data->set('thumb', $thumb['url']);
                $data->save();
            }
        }
    }
    
    echo microtime(true) - $modx->startTime;
      Артур Шевченко
      01 февраля 2021, 22:35
      0
      Вы в консоли весь этот код запускаете? Достаточно вот этого
      <?php
      // Проходимся по всем товарам
      $products = $modx->getIterator('msProduct', array('class_key' => 'msProduct'));
      foreach ($products as $product) {
          // Получаем оригиналы их картинок
          $files = $product->getMany('Files', array('parent' => 0));
          foreach ($files as $file) {
              // Затем получаем их преью
              $children = $file->getMany('Children');
              foreach ($children as $child) {
                  // Удаляем эти превью, вместе с файлами
                  $child->remove();
              }
              // И генерируем новые
              $file->generateThumbnails();
      
              // Если это первый файл в галерее - обновляем ссылку на превью товара
              /** @var msProductData $data */
              if ($file->get('rank') == 0 && $data = $product->getOne('Data')) {
                  $thumb = $file->getFirstThumbnail();
                  $data->set('thumb', $thumb['url']);
                  $data->save();
              }
          }
      }
        Андрей
        01 февраля 2021, 22:56
        0
        Запускаю в консоли сервера, через SSH
          Артур Шевченко
          01 февраля 2021, 23:03
          0
          А в админку доступ есть? Установите Console и запустите, уверен всё сработает.
    Константин Ильин
    01 февраля 2021, 23:01
    0
    Есть отличный скрипт от хорошего человека :)

    ilyaut.ru/cheats/to-rebuild-all-previews-of-products/
      Андрей
      01 февраля 2021, 23:07
      0
      Я пробовал скрипт от хорошего человека. И почему-то раньше он работал безукоризненно.
      Теперь и он отдает ошибки:
      Fatal error: Uncaught Error: Call to a member function set() on null in /core/components/minishop2/processors/mgr/gallery/generate.class.php:45 Stack trace: #0 /core/model/modx/modprocessor.class.php(177): msProductFileGenerateProcessor->process() #1 /core/model/modx/modx.class.php(1764): modProcessor->run() #2 /core/components/console/processors/exec.class.php(24): eval()'d code(14): modX->runProcessor('mgr/gallery/gen...', Array, Array) #3 /core/components/console/processors/exec.class.php(24): eval() #4 /core/model/modx/modprocessor.class.php(177): ConsoleExecProcessor->process() #5 /core/model/modx/modx.class.php(1764): modProcessor->run() #6 /core/model/modx/modconnectorresponse.class.php(144): modX->runProcessor('exec', Array, Array) #7 /core/model/modx/modconnectorrequest.class.php(86): modConnectorResponse->outputContent(Array) #8 /core/model/modx/modconnectorrequest.class.php(73): modConnectorRequest->prepareResponse(Array) #9 /manager/components/console/connectors/console.php(11): modConnectorRequest->handleRequest(Array) #10 {main} thrown in /core/components/minishop2/processors/mgr/gallery/generate.class.php on line 45
        Артур Шевченко
        01 февраля 2021, 23:15
        0
        Cкрипт который вы скинули работает в админке через Console, я проверил, значит дело не в скрипте.
          Андрей
          01 февраля 2021, 23:18
          0
          Админка должна работать или можно запустить и выйти?
            Артур Шевченко
            01 февраля 2021, 23:19
            0
            Нужно оставить открытой.
              Андрей
              01 февраля 2021, 23:51
              0
              Не, это не вариант… он по 12 часов работает и не факт что сделает.
              Может версия php пониже нужна?
                Константин Ильин
                02 февраля 2021, 00:02
                0
                Так попробуйте. Надо исходить из последних изменений которые вы делали. Например обновили минишоп и что-то не работает, повысили php — отвалилось все. У вас работало и вдруг долго стало и ошибки пошли, причинно-следственную связь надо построить.
                Первое, чтобы я попробовал это версия пхп.
                так же версии модх и минишопа написать можно.
                  Артур Шевченко
                  02 февраля 2021, 00:15
                  0
                  А если частями, попробуйте для начала на небольшом количестве. Сколько примерно фотографий?
                    Андрей
                    02 февраля 2021, 00:28
                    0
                    Товаров 3-4к, фото примерно 1-3 в каждом.
                    А как поправить скрипт, чтобы он брал товары одной категории, вместе с ее подкатегориями?
                      Артур Шевченко
                      02 февраля 2021, 00:52
                      +1
                      $products = $modx->getIterator('msProduct', array('class_key' => 'msProduct', 'parent' => тут id категории));
                      Не думаю что на 12к фотографий нужно 12 часов. Я думаю счёт пойдет на минуты.
                        Роман
                        02 февраля 2021, 13:24
                        0
                        Если фотографии с ватермарками или большого размера, то вполне возможно. Все зависит от хостинга, и свободных ресурсов. Попробуйте в несколько потоков пустить(возможно будет быстрее).
                          Андрей
                          02 февраля 2021, 13:48
                          0
                          А как это сделать?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      17