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


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 загружаются в память).

 

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

  • Что нового в Shopkeeper 4.0.3:

    Исправлено некорректное определение языка по умолчанию В настройках в админке скрываются пароли. Добавлена возможность загружать картинки для категорий. shopkeeper.js - добавлена функция updateProductsPrice() для поддержки текстовых полей для цены. Twig-функции contentList() и includeContent() вынесены в отдельный класс. Добавлено событие "order.before_create". Сортировка всех полей типа контента перетаскиванием. Автоматическое сохранение сортировки полей при сохранении типа контента (не нужно нажимать на отдельную кнопку). В интерфейсе админа добавлено поле поиска для списка Composer-пакетов.

    Скачать можно на главной странице https://modx-shopkeeper.ru/

    Читать далее
  • Вот этот плагин:
    0_1550334109280_screenshot_022.png

    Вроде по умолчанию он выключен. Надо включить. Но плагин работает только на редактирование товаров, при удалении он делалать ничего не будет. Только что проверил кнопку, всё работает корректно, фильтры удаляются и добавляются, когда нужно. Но нужно очищать корзину после удаления товаров (возможно баг).

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

    @Andchir Если нажимаю кнопочку "Обновить значения", то в фильтрах появляются как раз те самые удаленные значения фильтра.. Потом приходится Ручками выбирать эти удаленные значения.
    вот так выглядит Управление фильтрами когда удаляешь ручками: https://yadi.sk/i/_zw64CGkZ_sAYg
    А вот так выглядит когда просто нажимаешь "Обновить значения": https://yadi.sk/i/7WFbXC6xV5sQAw (красным выделено, то что приходится постоянно удалять

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

    Участник @Jokerit написал в TagManager2 отображает в фильтре удаленные значения TV-полей:

    tmRefresh

    Так и не смог найти как включить

    Читать далее