2013-06-27 40 views
2

我有一個腳本正在同步倉庫系統與電子商務Magento的問題。Magento - PHP腳本內存限制過載

腳本正在將Magento的記錄直接更新到數據庫,價格和數量。

致命錯誤:用盡33554432個字節允許內存大小(試圖分配8309個字節)/lib/Zend/Cache/Backend/File.php上線962

這顯然內存吃腳本,有沒有任何方式來減少它的飢餓?:)

我可以增加內存容量,但它不會是解決方案,因爲那一刻有大約700MB的內存空間。

.csv文件中大約有1000行。

<? 

define('MAGENTO', realpath(dirname(__FILE__))); 
require_once MAGENTO . '/app/Mage.php'; 

umask(0); 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$count = 0; 
$file = fopen(MAGENTO . '/SECRET-FOLDER-WITH-CSV/quantity-and-prices.csv', 'r'); 
while (($line = fgetcsv($file)) !== FALSE) { 

    if ($count == 0) { 
     foreach ($line as $key => $value) { 
      $cols[$value] = $key; 
     } 
    } 

    $count++; 

    if ($count == 1) 
     continue; 

    #Convert the lines to cols 
    if ($count > 0) { 
     foreach ($cols as $col => $value) { 
      unset(${$col}); 
      ${$col} = $line[$value]; 
     } 
    } 

    // Check if SKU exists 
    $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku); 

    if ($product) { 

     $productId = $product->getIdBySku($sku); 
     $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId); 
     $stockItemId = $stockItem->getId(); 
     $stock = array(); 

     $newprice = $line[2]; 

     $product->setPrice($newprice)->save(); 


     if (!$stockItemId) { 
      $stockItem->setData('product_id', $product->getId()); 
      $stockItem->setData('stock_id', 1); 
     } else { 
      $stock = $stockItem->getData(); 
     } 

     foreach ($cols as $col => $value) { 
      $stock[$col] = $line[$value]; 
     } 

     foreach ($stock as $field => $value) { 
      $stockItem->setData($field, $value ? $value : 0); 
     } 


     $stockItem->save(); 

     unset($stockItem); 
     unset($product); 
    } 

    echo "<br />Stock updated $sku"; 
} 
fclose($file); 

回答

3

更換產品的->loadByAttribute每個循環由單一產品的收集負載上,你會遍歷:

  • 循環在你的文件中的行和存儲每個SKU需要
  • 負荷使用此SKU陣列收集:

    $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('entity_id') //add what you need but restrict it the most possible ->addAttributeToSelect('sku', $skuArray) ->load()

  • 迭代您的收藏並做什麼y OU需要

2

三種不同的方式,你可以這樣做: -

  1. 編輯ini.file - 你描述它,但它只能如果主機託管服務提供商允許以這種方式重寫PHP設置來完成。

  2. 編輯.htaccess文件:php_value memory_limit 256M。

  3. edit index.php,add ini_set('memory_limit','256M');

2

插入下面的代碼

ini_set('memory_limit', '64M'); 

define('MAGENTO_ROOT', getcwd()); 
在index.php文件

。它正在與我合作。