我有一个更新或删除magento产品的脚本,但我注意到消耗了大量内存,我已经得到了
PHP Fatal error: Allowed memory size of 4294967296 bytes exhausted (tried to allocate 130968 bytes) in /home/public_html/lib/Zend/Locale/Data.php on line 852
所以问题可能在于我的脚本,也许它必须是优化的。
我的脚本采取的步骤:
1-拨打api电话以获取我们的分销商的所有产品
2-从我们的商店获取所有产品;
3-循环是在线商店产品集合;
4-在每个产品的迭代中搜索来自api调用的数据内的产品,如果存在产品,它应该更新库存和价格,如果不存在则应该删除产品,因为它不存在。
这是我的代码,也许任何人都可以找到错误。
set_time_limit(0);
ini_set('memory_limit', '4096M');
require 'app/Mage.php';
umask(0);
Mage::app();
Mage::register('isSecureArea', 1);
$productCollection = Mage::getResourceModel('catalog/product_collection')
->addFieldToFilter(array(
array('attribute'=>'reference','neq'=>''),
));
//Get all Products API
$data = curlRequestObject("rest/catalog/products.xml?isoCode=pt");
$productCollectionLength = count($productCollection);
foreach ($productCollection as $product) {
try {
$reference = $product->getReference();
$res = $data->xpath("item/sku[.='{$reference}']/parent::*");
//Product Info
$productID = $res[0]->id;
$price = $res[0]->retailPrice;
if (count($res) <= 0){
echo $product->getId() ." Deletec." . PHP_EOL;
$product->delete();
continue;
}
//Update Stock
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockAvailable = checkStock($productID);
if ($stockItem->getId() > 0 and $stockItem->getManageStock()) {
$qty = $stockAvailable;
$stockItem->setQty($qty);
$stockItem->setIsInStock((int)($qty > 0));
$stockItem->save();
}
//Update Price
$priceUpdate = Mage::getModel('catalog/product')->load($product->getId());
$priceUpdate->setPrice($price);
if($priceUpdate->getSpecialPrice() > $price){
$priceUpdate->setSpecialPrice("");
}
$priceUpdate->save();
echo $product->getReference() . PHP_EOL;
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
}
function curlRequestObject($api = "rest/catalog/category/2399.xml?isoCode=pt")
{
$ch = curl_init("http://api.domain.com/".$api);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: text/xml; charset=UTF-8',
'Authorization: Bearer hashasdada',
'Accept: text/plain'
));
$data = curl_exec($ch);
curl_close($ch);
$oXML = new SimpleXMLElement( $data );
return $oXML;
}
function checkStock($id = 0)
{
/* if($id === 0){
return http_response_code(404);
}*/
$api = "rest/catalog/productstock/".$id.".xml?isoCode=pt";
$ch = curl_init("http://api.domain.com/".$api);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: text/xml; charset=UTF-8',
'Authorization: Bearer dasdsa',
'Accept: text/plain'
));
$data = curl_exec($ch);
curl_close($ch);
$oXML = new SimpleXMLElement( $data );
return $oXML->stocks->quantity;
}
答案 0 :(得分:1)
产品型号('catalog / product')上的加载和保存等方法会占用大量内存。(并触发一些事件)
因为您正在遍历产品集合('catalog / product_collection'),所以您可以通过
将您的getter属性添加到集合查询中<StyleInfoPost>
<name>roads_style</name>
<filename>roads.sld</filename>
</StyleInfoPost>
这样你可以摆脱
$productCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('special_price')
->addAttributeToSelect('reference')
->addFieldToFilter(array(
array('attribute'=>'reference','neq'=>''),
));
只需使用集合中的$ product model对象
其次,你将通过替换
来提升整个事物Mage::getModel('catalog/product')->load($product->getId());
与
$priceUpdate->setPrice($price);
$priceUpdate->save();
与special_price
相同启用并运行产品平面数据,如果您拥有大量属性且产品数量低于100k,这将加快收集效果
答案 1 :(得分:0)
您可以通过设置无限内存来更新脚本的内存限制,如下所示。
ini_set("memory_limit",-1); // Add this line in your starting part of the script.