2

倉庫システムを e コマース 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

コードの下に挿入

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

define('MAGENTO_ROOT', getcwd());

index.php ファイルで。それは私と一緒に働いています。

于 2015-05-15T07:36:40.197 に答える
3

Product の for each ループを、反復する単一の Product のコレクション ロードに置き換え->loadByAttributeます。

  • ファイル行をループして、必要な各 SKU を保存します
  • この SKU 配列を使用してコレクションをロードします。

    $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('entity_id') //必要なものを追加しますが、可能な限り制限します ->addAttributeToSelect('sku', $skuArray) ->ロード()

  • コレクションを反復処理し、必要なことを行います

于 2013-06-27T12:50:08.300 に答える
2

あなたができる3つの異なる方法: -

  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 に答える