2

我遇到了将仓库系统与电子商务 Magento 同步的脚本的问题。

脚本正在将 Magento 的记录直接更新到数据库中,价格和数量。

致命错误:第 962 行 /lib/Zend/Cache/Backend/File.php 中允许的内存大小为 33554432 字节已用尽(尝试分配 8309 字节)

明明是吃记忆的剧本,有什么办法可以减少它的饥饿感?:)

我可以增加内存容量,但这不是解决方案,因为目前大约有 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);
4

3 回答 3

3

将每个循环的产品替换->loadByAttribute为您将迭代的单个产品的集合负载:

  • 遍历您的文件行并存储您需要的每个 SKU
  • 使用此 SKU 数组加载集合:

    $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('entity_id') //添加你需要的但尽可能限制它 ->addAttributeToSelect('sku', $skuArray) ->加载()

  • 迭代您的收藏并做您需要的事情

于 2013-06-27T12:50:08.300 回答
3

在下面插入代码

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

define('MAGENTO_ROOT', getcwd());

在 index.php 文件中。它正在和我一起工作。

于 2015-05-15T07:36:40.197 回答
2

您可以通过三种不同的方式进行操作:-

  1. 编辑 ini.file - 你描述了它,但只有在主机允许以这种方式重写 php 设置时才能完成。

  2. 编辑 .htaccess 文件:php_value memory_limit 256M。

  3. 编辑 index.php,添加 ini_set('memory_limit', '256M');

于 2013-06-27T13:21:49.683 回答