Долго создаются товары через api

Делаю выгрузку товаров. Товары создаются около секунды, что много, учитывая, что нужно выгрузить их более 7000. В чём может быть причина? Категории создаются гораздо быстрее, способ примерно такой же.

<?php 
// import_products - таблица, временное хранилище для свойств товара
$total = $this->modx->getCount('import_products', ['imported' => 0]);
$this->log[] = "Товаров для импорта: $total";

$query = $this->modx->newQuery('import_products');
$query->limit($this->cfg['limit_products']); // с лимитом 1 создаётся около секунды
$query->where(['imported' => 0]);
$items = $this->modx->getCollection('import_products', $query);

$imported = 0;
foreach ($items as $item) {
    $obj = null;
    $data = json_decode($item->data, true) ?? [];

    // код get_field() - в конце
    $parent = Helpers::get_field('import_categories', 'modx_id', ['import_id' => $item->import_parent_id]);
    if (!$parent) {
        $this->log[] = "⚠ Нет категории для {$item->name}";
        continue;
    }
    if (empty($data['price'])) {
        $this->log[] = "⚠ Нет цены для {$item->name}";
        continue;
    }

    if ($item->modx_id) {
        $obj = $this->modx->getObject('msProduct', $item->modx_id);
    }
        
    if (empty($obj)) {
        $this->log[] = "Создание товара: {$item->name}";
        $obj = $this->modx->newObject('msProduct');
        $alias = $obj->cleanAlias($item->name) . '-' . $item->id;
        $obj->set('alias', $alias);
        $obj->set('published', 1);
        $obj->set('template', $this->cfg['product_tmpl']);
        $obj->set('show_in_tree', 0);
    } else {
        $this->log[] = "Обновление товара: {$item->name}";
    }

    if (!empty($data['article'])) {
        $obj->set('article', trim($data['article']));
    }
    $obj->fromArray([
        'pagetitle' => trim($item->name),
        'parent' => $parent,
        'published' => 1,
        'template' => $this->cfg['product_tmpl'],
        'price' => $data['price'],
    ]);

    if ($obj->save() && $obj->id) {
        $item->set('imported', 1);
        $item->set('modx_id', $obj->id);
        $item->save();
        $imported++;
    }
}

if ($imported === $total) {
    $this->log[] = "Товары импортированы";
    return 'done';
} else {
    return 'continue';
}

// метод get_field
public static function get_field($object, $field = 'id', $where)
{
    global $modx;

    $name = 'import_get_field_' . md5(json_encode(func_get_args()));
    $cache = $modx->cacheManager->get($name, [\xPDO::OPT_CACHE_KEY => 'resource']);
    if (isset($cache)) {
        return $cache;
    }

    $q = $modx->newQuery($object, $where);
    $q->select($field);
    $value = $modx->getValue($q->prepare());

    $modx->cacheManager->set($name, $value, 0, [\xPDO::OPT_CACHE_KEY => 'resource']);
    return $value;
}
Лёша
26 марта 2022, 15:42
modx.pro
144
+1

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

Лёша
26 марта 2022, 19:16
0
Обычный ресурс создаётся за 0.02 с, товар minishop — 1.14 c.
file.modx.pro/files/e/9/9/e9948e0ecd5cef36e7f0350e16d96d80.png
file.modx.pro/files/2/9/4/29434f0d0b9976ddfc2d611c00c74699.png
    Лёша
    26 марта 2022, 20:29
    0
    Вот так создаются за 0,002 с

    function create(string $table, array $data) {
        global $modx;
        
        $keys = [];
        $values = [];
        foreach ($data as $key => $value) {
            $keys[] = "`$key`";
            $values[] = is_int($value) ? $value : "'$value'";
        }
        $keys = implode(', ', $keys);
        $values = implode(', ', $values);
        
        $table = $modx->getOption(xPDO::OPT_TABLE_PREFIX) . $table;
        $sql = "INSERT INTO {$table} ({$keys}) VALUES ({$values});";
        $stmt = $modx->prepare($sql);
        $stmt->execute();
        return $modx->lastInsertId();
    }
    
    $id = create('site_content', [
        'pagetitle' => 'test товар 3',
        'parent' => 1,
        'class_key' => 'msProduct',
    ]);
    
    $id = create('ms2_products', [
        'id' => $id,
        'article' => 'test 1',
        'price' => '50.9',
    ]);
      Александр
      27 марта 2022, 20:24
      0
      Я точно не в курсе, но вообще когда создаешь через api MODX запускаются дополнительные обработки. Какие надо смотреть класс msProduct. Но скорей всего там tv обрабатываются. Например, при создании через процессор запускаются плагины на событие OnDocFormSave. Через getObject события тоже могут запускаться.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3