更新Magento产品内存限制

时间:2017-10-25 17:38:15

标签: php magento magento-1.9

我有一个更新或删除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;



  }

2 个答案:

答案 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.