Magento - API Stock Qty Update (МЕДЛЕННО КАК АД) - PullRequest
2 голосов
/ 01 марта 2012

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

, поэтому, когда сксписок длиной 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 может быть довольно медленным, он делает touch wood , кажется, завершается до последнего sku, но все еще запускает белый phpошибка.

есть какие-нибудь идеи относительно того, является ли мой код чепухой или это просто природа API?

касается Энди.

1 Ответ

7 голосов
/ 01 марта 2012

Каждый вызов 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.
...