Magento - API Stock Qty Update (МЕДЛЕННО КАК АД)

Хорошо, я использую Magento API для обновления запасов, однако я использую CSV-экспорт продуктов, которые содержат товарные скусы, которые существуют в magento, и те, которые не

поэтому, когда список sku 3 длинных, он работает нормально.

когда это 8k+ долго, это ломается. например, он пыхтит и вурс, а затем "php белые экраны смерти"

Мой код также запрещает вводу специальных skus (не спрашивайте), они все вещи pre_match.

поэтому мой код выглядит так:

    $proxy = new SoapClient('http://www.magentosite/index.php/api/?wsdl');
$sessionId = $proxy->login('user', 'apikey');


if (($handle = fopen("../stock.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {


            if(count($proxy->call($sessionId, 'product_stock.list', $data[1])) > 0 && (preg_match('/specialcode1/', $data[1]) || preg_match('/^specialcode2/i', $data[1]) || preg_match('/specialcode3/', $data[1]))){

                        $proxy->call($sessionId, 'product_stock.update', array($data[1], array('qty'=>$data[2])));

            }

}
}
fclose($handle);





echo 'complete';

так что я понимаю, что API может быть довольно медленным, он действительно работает до последнего sku, но все равно выдает белую ошибку php.

Любые идеи о том, если это мой код дерьмо или это просто природа API?

С уважением Энди.

1 ответ

Каждый вызов API имеет большие издержки, а именно обширную ООП-систему Magento. Немного подумав, количество звонков можно уменьшить.

if (($handle = fopen("../stock.csv", "r")) !== FALSE) {
    $qtyBySku = array();
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        // first column ($data[0]) is ignored.
        list(, $sku, $qty) = $data;
        $qtyBySku[$sku] = (float) $qty;
    }
    fclose($handle);

    $skus = preg_grep('/specialcode1|^specialcode2|specialcode3/',
                array_keys($qtyBySku));
    if ($skus) try {
        $proxy = new SoapClient('http://www.magentosite/index.php/api/?wsdl');
        $sessionId = $proxy->login('user', 'apikey');

        // Break into blocks of 100 because it's TOO efficient
        foreach (array_chunk($skus, 100) as $skuChunk) {
            $stock = $proxy->call($sessionId, 'product_stock.list',
                         array($skuChunk));
            if ($stock) {
                $calls = array();
                foreach ($stock as $product) {
                    $sku = $product['sku'];
                    $qty = $qtyBySku[$sku];
                    $calls[] = array(
                        'product_stock.update', array($sku, array(
                            'qty' => $qty,
                            // only in stock if qty is high enough
                            'is_in_stock' => $qty > 0
                        ))
                    );
                }
                $proxy->multiCall($sessionId, $calls);
            }
        }
        $proxy->endSession($sessionId);

        echo 'complete';
    }
    catch (SoapFault $err) {
        echo $err;
        // or do something more interesting here
    }
    // else nothing to update
}

Обратите внимание на некоторые изменения в здравом смысле:

  • Файл открывается и закрывается перед входом в API, он быстро проверяет наличие файла и медленно устанавливает сетевое соединение.
  • SKU проверяется на наличие специального кода перед product_stock.list, есть только вход в систему, если какие-либо SKU совпадают. Опять же, локальная работа выполняется быстрее, чем удаленная.
  • Одно регулярное выражение используется вместо нескольких, и preg_grep анализирует выражение только один раз, а не один раз для каждой записи.
  • product_stock.list принимает массив идентификаторов или SKU, что означает, что вы можете просмотреть все записи за один раз.
  • Вам не нужно ждать product_stock.update вернуть значение (хотя оно и есть), что означает, что вы можете сделать много одновременно multiCall,
Другие вопросы по тегам