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
,