Перегенерация всех фото товаров с ошибками
Добрый день.
Пытаюсь перегенерировать все фото товаров сайта (порядка 3000 позиций) через скрипт из документации.
Запускаю через консоль и он во-первых работает очень долго (порядка 12 часов), во-вторых заканчивается множественными ошибками. Вот выдержка из логов:
Пытаюсь перегенерировать все фото товаров сайта (порядка 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:Можете что-то подсказать? Может версия PHP не та (7.4) или еще что-то…
#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] $
Комментарии: 17
Код покажите.
<?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;
Вы в консоли весь этот код запускаете? Достаточно вот этого
<?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();
}
}
}
Запускаю в консоли сервера, через SSH
А в админку доступ есть? Установите Console и запустите, уверен всё сработает.
Я пробовал скрипт от хорошего человека. И почему-то раньше он работал безукоризненно.
Теперь и он отдает ошибки:
Теперь и он отдает ошибки:
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
Cкрипт который вы скинули работает в админке через Console, я проверил, значит дело не в скрипте.
Админка должна работать или можно запустить и выйти?
Нужно оставить открытой.
Не, это не вариант… он по 12 часов работает и не факт что сделает.
Может версия php пониже нужна?
Может версия php пониже нужна?
Так попробуйте. Надо исходить из последних изменений которые вы делали. Например обновили минишоп и что-то не работает, повысили php — отвалилось все. У вас работало и вдруг долго стало и ошибки пошли, причинно-следственную связь надо построить.
Первое, чтобы я попробовал это версия пхп.
так же версии модх и минишопа написать можно.
Первое, чтобы я попробовал это версия пхп.
так же версии модх и минишопа написать можно.
А если частями, попробуйте для начала на небольшом количестве. Сколько примерно фотографий?
Товаров 3-4к, фото примерно 1-3 в каждом.
А как поправить скрипт, чтобы он брал товары одной категории, вместе с ее подкатегориями?
А как поправить скрипт, чтобы он брал товары одной категории, вместе с ее подкатегориями?
$products = $modx->getIterator('msProduct', array('class_key' => 'msProduct', 'parent' => тут id категории));
Не думаю что на 12к фотографий нужно 12 часов. Я думаю счёт пойдет на минуты.
Если фотографии с ватермарками или большого размера, то вполне возможно. Все зависит от хостинга, и свободных ресурсов. Попробуйте в несколько потоков пустить(возможно будет быстрее).
А как это сделать?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.