Fla*_*akx 2 csv api product magento
我正在使用Magento API更新库存,但是我使用的CSV导出产品包含magento中存在的产品skus和不存在的产品skus
因此,当sku列表长达3个时,它可以正常工作.
当它长达8k +时它会断裂.例如它chuggs和wurrs然后'php white screen of death'
我的代码也停止了特殊的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';
Run Code Online (Sandbox Code Playgroud)
所以我理解API可能会很慢,它确实触摸木材似乎完成到最后的sku但仍然会引发一个白色的PHP错误.
关于我的代码是垃圾还是仅仅是API的本质的任何想法?
对安迪说.
每个API调用都有很大的开销,即Magento广泛的OOP系统.通过一些思考,可以减少呼叫次数.
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
}
Run Code Online (Sandbox Code Playgroud)
请注意一些常识变化:
product_stock.list
,如果有任何SKU匹配则只有登录.同样,本地工作比远程更快.preg_grep
仅解析表达式一次,而不是每个记录一次.product_stock.list
获取一系列ID或SKU,这意味着您可以一次查找所有记录.product_stock.update
返回一个值(尽管它有一个),这意味着您可以同时执行多个操作multiCall
.