Im Moment verwende ich viele Sammlungen, die in foreach-Schleifen verschachtelt sind. Ist es möglich, diese Dinge ein paar Ebenen nach oben zu bewegen? Derzeit bin ich gezwungen, Sammlungen mit mehr als 51.000 Entitäten immer wieder neu zu laden, was die Dinge enorm verlangsamt. Speziell die Kitinventory-Kollektionen.
<?php
class Codespace_Module_Helper_Item extends other_one{
function functionOne($collection){
...
$data = $collection->getData();
foreach($data as $item){
$this->_functionTwo($item);
}
...
}
function _functionTwo($item){
$model = Mage::getModel('catalog/product');
$id = $model->getIdBySku($item['sku']);
$inventoryStatus = Mage::getResourceSingleton('catalog/product')->getAttributeRawValue($id, 'product_inventory_status', 1);
$invStatus = $model->getResource()->getAttribute('product_inventory_status')->getSource()->getOptionText($inventoryStatus);
if ($invStatus && $id) {
if ($invStatus !== 'Z') {
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->setData(array());
$stockItem->loadByProduct($id);
if ($stockItem->getQty() != $item['quantity']) {
$stockItem->setQty(item['quantity']);
$stockItem->save();
$this->functionThree($item['sku']);
}
}
}
}
function functionThree($sku){
$collectionOfKits = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('related_sku',$sku);
if($collectionOfKits->getSize()){
foreach($collectionOfKits as $kit){
$kitSku = $kit->getSku();
$kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku',$kitSku)->setOrder('related_sku','ASC');
...
foreach($kitCollection as $component){
$componentSkus[] = $component->getRelatedSku();
$componentRequiredQuantity[] = $component->getRequiredQuantity();
}
$componentProductCollection = Mage::getModel('catalog/product')->getCollection();
$componentProductCollection->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left');
$componentProductCollection->addAttributeToFilter('sku', array('in' => $componentSkus));
foreach($componentProductCollection as $component){
$quantity = $component->getQty();
...
}
$kitId= Mage::getModel('catalog/product')->getIdBySku($kitSku)
$kitStockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($kitId);
$this->functionFour($kitStockItem,$kitSku,$amountOfKitsPossible);
}
}
}
function functionFour($kitStockItem,$kitSku,$amountOfKitsPossible){
...
$kitStockItem->setQty($quantity);
$kitStockItem->save();
...
}
BEARBEITEN: Dies ist die aktuelle Funktionalität, die ich mir ausgedacht habe. Ich denke immer noch, dass es eine bessere Möglichkeit gibt, mit diesen Sammlungen umzugehen.
collection
model
object
easymoden00b
quelle
quelle
functionOne($collection)
? In welcher Reihenfolge würde die Größe / Anzahl der Artikel liegen? Muss eine Schleife ausgeführt werden, um die SKUs zu erhalten?Antworten:
Es gibt einige Dinge, an denen Sie arbeiten können.
&
in der Funktion angegebene Parameterdeklaration hinzufunction hello(array &$world)
if
Anweisungen, um weniger Einrückungen zu erzielen->cleanModelCache()->clearInstance()
vonMage_Core_Model_Model_Abstract
, um zugrunde liegende Daten für einige Objekte zu löschen und die Dinge zu beschleunigen.Es wurde eine aktualisierte Version Ihres Codes mit einigen Inline-Empfehlungen zu Ihrem aktuellen Code hinzugefügt. Ich könnte ein bisschen weitermachen, aber es würde momentan nicht mehr dazu beitragen.
Funktion 1: Zweck ist das Durchlaufen der Sammlung
Funktion 2: Zweck ist die Aktualisierung des Bestands bei Änderung
Funktion 3: Zweck der Aktualisierung zugehöriger Lagerartikel
Funktion 4: Musste einige glückliche (oder unglückliche) Vermutungen anstellen, für den Moment ist es eine nutzlose Funktion, die wie in Funktion 3 hinzugefügt werden kann.
quelle
Ich wollte dies als Kommentar hinzufügen, aber ich habe noch nicht genug Repräsentanten. Schauen Sie sich hier an, wie die Magento-Kerngitter die Produktmenge mit der Katalog- / Produktkollektion verbinden: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Adminhtml /Block/Catalog/Product/Grid.php#L65
Wenn Sie sich der Tabelle anschließen, um die Menge zu erhalten, müssen Sie dies nicht in einer Schleife aufrufen:
Mage::getModel('cataloginventory/stock_item')->loadByProduct($product)->getQty();
Die andere Alternative besteht darin, zu prüfen, ob Sie die Ergebnisse dieses systemintensiven Prozesses zwischenspeichern können. Vielleicht könnten Sie eine zweite Datenbanktabelle erstellen, um die Ergebnisse zu speichern, und sie aktualisieren lassen, wie es ein Magento-Index tun würde.
quelle
Sie müssen das Modell nicht immer wieder neu laden.
Mage::getModel()
Eine Referenz ist ausreichend, ohne zu wissen, wie Ihre Ressourcenmodelle eingerichtet sind. Es ist schwierig zu sagen, ob sie jedes Mal im Speicher neu initialisiert werden und in diesen Schleifen ein Leck auftritt oder nicht mehr ausreicht Speicher, der möglicherweise zu einem Plattenwechsel führt.Eine Sammlung, die alle regiert. Refactoring der Funktionen, um nur die eine Sammlung zu referenzieren. Dies gilt auch für die Standard-SQL-Programmierung und die prozedurale Programmierung. Nehmen Sie sich etwas mehr Zeit und untersuchen Sie Ihre Sammlungen und Ressourcenmodelle, um herauszufinden, wie Sie alle Daten, die Sie benötigen, einmal, möglicherweise zweimal aus SQL abrufen und dann über genügend Arbeitsspeicher verfügen. Es ist auch einfacher, ein Ergebnis im Cache zu speichern als viele. Dies gilt auch für die in MySQL integrierten Caching-Mechanismen, da häufige Anfragen, die groß genug sind, dasselbe Problem beim Austausch von Festplatten verursachen.
Speichern Sie die E / A
Vinai hat ein gutes Beispiel für die Umsetzung des gleichen Ansatzes:
Referenzen :
quelle