Последние темы


Catalofill выдает 502 ошибку при загрузке 35 000+ позиций

  • Сразу хочу поблагодарить Andchir за проделанную работу по шопкиперу и данному модулю. А теперь перехожу к проблеме.

    При загрузке файла, с 35 000+ позиций (csv фаил) и ~30 полями в нем на каждую позицию, прилетает 502 ошибка .
    Максимум что получилось это выгрузить около 20 000 строк (это самый лучший заплыв из всех☺ ).

    Как я понял это происходит из-за лимитов на выполнение скрипта или превышение запросов в БД (в 2 раза превысил). Хостер говорит что нужно оптимизировать скрипт так как он дает большую нагрузку.

    Сразу скажу что ставил кол-во импорта за раз ($cf_config['batch_import']) от 10 до 1000.

    Что можно сделать что бы как то облегчить нагрузку вызываемую скриптом или вообще скорость работы? Может ли catalogfill выгружать такие громоздкие прайсы?
    php 7.1
    MODX 2.7
    catalogfill 2.4.9-pl1

    Хостер timeweb

  • а что вам мешает разделить csv файл по 5тыс и заливать нормально? я обычно большие файлы разделяю, хотя тоже было +50к ресурсов +15тв

  • Может у вас хостинг за 3 копейки?
    Но зависит много от чего, например, делается ли какая-то проверка перед импортом (нужно видеть конфиг).

  • @atrox Клиент не всегда понимает разделение на 5к и хочет что бы все работало и сразу.

  • @Andchir

    <?php
     
    //разбивка по столбцам при импорте и экспорте (content|tv|category)
    $cf_config['content_row'] = array(
        array('артикул',array(6,'tv')),
        array('Цена',array(1,'tv')),
        array('Категория',array(4,'category')),
        array('производитель',array(4,'tv')),
        array('страна-производитель',array(11,'tv')),
        array('коллекция',array(12,'tv')),
        array('гарантия',array(13,'tv')),
        array('длина',array(14,'tv')),
        array('ширина',array(2,'tv')),
        array('высота',array(3,'tv')),
        array('отступ',array(15,'tv')),
        array('диаметр',array(16,'tv')),
        array('цоколь',array(17,'tv')),
        array('колво ламп',array(18,'tv')),
        array('мощность',array(19,'tv')),
        array('вольтажность',array(33,'tv')),
        array('влагозащищенность',array(20,'tv')),
        array('вырезные',array(21,'tv')),
        array('площадь освещения',array(22,'tv')),
        array('тип крепления',array(23,'tv')),
        array('выключатель',array(24,'tv')),
        array('пульт',array(25,'tv')),
        array('материал основания',array(26,'tv')),
        array('материал плафонов',array(27,'tv')),
        array('цвет основания',array(28,'tv')),
        array('цвет плафона',array(29,'tv')),
        array('стиль',array(30,'tv')),
        array('тип',array(32,'tv')),
        array('распродажа',array(34,'tv')),
        array('комплектация лампами',array(31,'tv')),
        array('новинка',array(35,'tv')),
        array('наличие',array(8,'tv')),
        array('изображение',array(7,'tv'))
    );
    
    //значения по умолчанию при импорте или проверка при экспорте
    $cf_config['imp_content_default'] = array(
        'content' => array(
            'published' => 1,
            'template' => 3
            //'createdon' => strtotime("now")
        ),
        'tv' => array(
            //7 => 0
        )
    );
    
    //первая строка - названия полей
    $cf_config['include_captions'] = true;
    
    //число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать.
    $cf_config['batch_import'] = 100;
    
    //разбивать по категориям
    $cf_config['include_categories'] = true;
    
    //удалять дочерние категории при очистке и обновлении каталога
    $cf_config['delete_subcategories'] = true;
    
    //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_field'] = false;
    
    //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_tvid_val'] = 6;
    
    //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
    $cf_config['imp_if_not_exist'] = true;
    
    //удалять HTML-теги при экспорте
    $cf_config['exp_strip_tags'] = false;
    
    //автоматически генерировать псевдоним (alias) при импорте
    //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
    $cf_config['imp_autoalias'] = true;
    
    //Изменить значения поля для всех вложенных товаров до начала импорта.
    //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
    //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
    $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены
    
    //удалить файл после экспорта (скачивания)
    $cf_config['exp_delete_file'] = false;
    
    //кодировка CSV-файла при экспорте
    $cf_config['exp_csv_charset'] = 'UTF-8';//'windows-1251'
    
    //Импортировать (обновлять) пустые значения
    $cf_config['imp_empty'] = true;
    
    //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
    $cf_config['imp_custom_processor'] = '';
    
    //путь (xpath) в XML структуре до товаров
    $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers'
    
    //Структура XML файла для импорта
    $cf_config['imp_xml_structure'] = '';
    
    //тестирование конфигурации (без записи в БД)
    $cf_config['imp_testmode'] = false;
    
    //функция для фильтрации значений при ИМПОРТЕ
    function filter_import($value_arr){
        $output_arr = $value_arr;
        
        /*
        if(isset($output_arr['content']['pagetitle']))
            $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8');
        */
        
        $output_arr['content']['pagetitle'] = $output_arr['tv'][4].' '. $output_arr['tv'][6];
        if(empty($output_arr['content']['alias'])){
                    $alias = $output_arr['tv'][4].' '. $output_arr['tv'][6];
             
                      $alias = str_replace(array("\n", "\r"), " ", $alias); // убираем перевод каретки
                      $alias = preg_replace("/\s+/", ' ', $alias); // удаляем повторяющие пробелы
                      $alias = trim($alias); // убираем пробелы в начале и конце строки
                      $alias = function_exists('mb_strtolower') ? mb_strtolower($alias) : strtolower($alias); // переводим строку в нижний регистр (иногда надо задать локаль)
                      $alias = strtr($alias, array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'e','ж'=>'j','з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'shch','ы'=>'y','э'=>'e','ю'=>'yu','я'=>'ya','ъ'=>'','ь'=>''));
                      $alias = preg_replace("/[^0-9a-z-_ ]/i", "", $alias); // очищаем строку от недопустимых символов
                      $alias = str_replace(" ", "-", $alias); // заменяем пробелы знаком минус
                    $alias2121 = urlencode($alias);
                    $output_arr['content']['alias'] = $alias2121;
                }
        if(isset($output_arr['tv'][7]))
        {
            $urlImage = $output_arr['tv'][7];
            $filename = basename($urlImage);
            file_put_contents('/home/g/gradmarket/lustr/public_html/upload/i/' . $filename, file_get_contents($urlImage));
            $output_arr['tv'][7] = '/upload/i/' .$filename;
        }
        return $output_arr;
    }
    
    
    //функция для фильтрации значений при ЭКСПОРТЕ
    function filter_export($value_arr,$doc_id=0){
        $output_arr = $value_arr;
        //var_dump($value_arr,$output_arr);
        //exit;
        /*
        if(isset($output_arr['price']))
            $output_arr[1] = floatval($output_arr[1]) - 200;
        */
        return $output_arr;
    }
    
    ?>
    
    

    Сразу объясню что происходит при импорте:

    1. У клиента в базе нет наименований, поэтому они создаются путем совмещения "Бренда" и "Артикула" и добавления уже его в pagetitle. Но при таком путем почему то не формируются алиас, и приходиться его на лету делать самому.

    2. Фото висят на сервере поставщика, поэтому я их от туда забираю и после вставляю уже в поля для фотографии.

    Сначала думал что может из-за выгрузки фоток проблема (типо долго отдает сервер и тп) поэтому и приходит 502. Отключение выгрузки фотографий разницы не дало.

    Про хостинг, на таймвебе много собирал уже магазинов и с 15к позиций проблем не было. Хостинг обычный виртуальный на 25 сайтов, проблема такая первый раз возникла.

  • Фото висят на сервере поставщика, поэтому я их от туда забираю и после вставляю уже в поля для фотографии.

    Вы хотите скачать 35 тыс. фотографий и уложиться в стандартный лимит времени? Мечтать не вредно.

  • @Andchir Прямо сейчас решил проверить, отключил обработку ссылок с фотографиями. На 25% выдал 502 ошибку.
    После этого при отключении создания алиасов вообще выдал 13% (но это похоже уже на блокировку сервером).

    Обычно модуль работает как часы, а тут какая-то беда☹

  • На сколько я помню, в модуле при импорте обновляется цифра в поле начала импорта и потом можно с неё продолжить.

    Вопросы:

    1. Какие стоят лимиты на сервере memory_limit и max_execution_time? Это можно посмотреть в админке - "Информация о системе" -> phpinfo()
    2. Вы обновляете товары или добавляете?
  • @Andchir
    memory_limit - 256M
    max_execution_time - 10000 (Local Value) 120 (Master Value)

    Вообще выбираю обновление, так как позиции уже есть (где то с картинками, где то нет, тестировал когда)

    Если выбирать "Добавить", это как то на логику работы скрипта сильно повлияет?

  • Как я понял это происходит из-за лимитов на выполнение скрипта или превышение запросов в БД (в 2 раза превысил).

    Почему такая не точная информация? Нужно открыть лог PHP-ошибок и посмотреть. Возможно не хватает памяти, по-моему для 35 тысяч товаров 256 MБ маловато, если это ресурсы (документы) MODX. Уже много раз говорилось, что для больших магазинов нужно делать для товаров отдельную таблицу (MIGXDB).

  • @Andchir Сделал товары в MIGXBD, прирост скорости увидел. И правда обработка идет явно быстрей, за этот намек благодарю😀

    Но после 17к строчки снова вышла 502, конечно можно догружать с нужной строчки (во второй заход с добавлением с 17к строки на 21к тоже вышла 502).
    Правда это конечно не идеальное решение.
    В логах нету ошибок (смотрел хостовские и modx).

  • И после 20к уже каждые 3-4 тысячи выдает ошибку, что бы загрузить все сразу нужно раз 10 повторять с нужной строки.

  • В логах нету ошибок (смотрел хостовские и modx).

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

    И после 20к уже каждые 3-4 тысячи выдает ошибку

    Старые тысячи ресурсов MODX удалили? Их надо удалить, чтобы они не занимали память (все URL загружаются в память).

 

Последние комментарии

  • Документация: https://modx-shopkeeper.ru/docs/shopkeeper-3/shopkeeper-3
    Там написано какие плейсхолдеры доступны.
    Если имеется ввиду цена одного товара, то [[+price]] - это цена без доп. параметров.

    Читать далее
  • D

    Такой вопрос: как вывести цену без дополнительных атрибутов? В мини-корзине.

    Читать далее
  • в категорию assets/catalogfill/files/ экспорт происходит нормально.

    Что-то в вашем сообщении всё перемешано. Папки или категории? А если папки (с файлами), то какие у них могут быть id...
    Если появляется сообщение про категорию, то это имеется ввиду категория каталога (документ MODX).

    Читать далее
  • D

    Добрый день!

    Искал такой функционал в настройках или в конфигах, найти не получилось. Суть такая: клиент может загружать файлы только в media/ (Источник файлов 1 Filesystem, но есть еще один с полным доступом в корень id 4), таким образом, при загрузке файлов CatalogFill не видит файлы. Возникакет ошибка о том что нет такого каталога. Создаю его в ФС. Загрузка не происходит. в категорию assets/catalogfill/files/ экспорт происходит нормально. Есть какие-то возможности переключить именно для catalogfill возможность загрузить в четверый источник без модификации самого компонента?

    Версия последняя, производил обновление сегодня.

    Заранее благодарен.

    Читать далее