Có một vài điều bạn có thể làm việc;
- không truyền qua tham chiếu, vì vậy sử dụng bộ nhớ bổ sung, bạn có thể truyền các đối tượng, nhưng các mảng không thể được truyền theo tham chiếu theo mặc định. Hoặc thêm một
&
khai báo tham số chức năng nhưfunction hello(array &$world)
- kiểm tra không hợp lệ, nếu cái gì đó không có trở lại ngay lập tức. Đừng cố tìm thứ gì đó không có ở đó
- đôi khi có thể đọc được
- thêm một số tài liệu (để bạn có thể hiểu nếu bạn thấy nó trong một vài ngày, tháng, năm)
if
báo cáo thông minh hơn để nhận được ít thụt lề
- các chức năng chỉ nên có một mục đích, cập nhật chứng khoán hoặc cập nhật liên quan, không phải cả hai, vì vậy thậm chí có thể cắt một số chức năng trong các chức năng thậm chí nhỏ hơn. Cố gắng tạo ra logic như vậy trong tâm trí của bạn, và làm lại từ đó.
- Hãy xem
->cleanModelCache()->clearInstance()
từ Mage_Core_Model_Model_Abstract
để xóa dữ liệu cơ bản cho một số đối tượng, có thể tăng tốc mọi thứ.
- của tất cả những điều khác đã được nói.
Đã thêm phiên bản cập nhật của mã của bạn với một số đề xuất nội tuyến về mã hiện tại của bạn, tôi có thể tiếp tục một chút, nhưng hiện tại nó sẽ không thêm nhiều hơn vào mã.
Chức năng 1: Mục đích là đi bộ sưu tập
/**
* Walk collection
*
* @param Mage_Core_Model_Resource_Db_Collection_Abstract $collection
* @return void
*/
public function functionOne($collection)
{
// ...
// Walk collection, create references instead of passing array data
foreach ($collection as $item) {
// Update stock for product
if (!$this->_functionTwo($item)) {
// Not updated, continue next
continue;
}
// Update related products
$this->_functionThree($item); // Use same object again, no extra memory is used
}
// ...
}
Chức năng 2: Mục đích là cập nhật chứng khoán nếu thay đổi
/**
* Update stock item if changed, returns true if updated
*
* @param Mage_Core_Model_Model_Abstract $item
* @return bool
*/
function _functionTwo($item)
{
$model = Mage::getModel('catalog/product');
/** @var $model Mage_Catalog_Model_Product */
$id = $model->getIdBySku($item->getData('sku'));
if (!$id) {
// no id found, so stop looking nothing up
return false;
}
// Get option value for store 1
$inventoryStatus = $model->getResource()
->getAttributeRawValue($id, 'product_inventory_status', 1);
if (!$inventoryStatus) {
// No need for another lookup in db, because the status isn't set
return false;
}
$invStatus = $model->getResource()
->getAttribute('product_inventory_status')
->setStoreId(0) // Get admin value
->getSource()
->getOptionText($inventoryStatus);
if (!$invStatus) {
// No need for another lookup in db, because the status has no text
return false;
}
if ($invStatus === 'Z') {
// Inventory status to not change something
return false;
}
$stockItem = Mage::getModel('cataloginventory/stock_item');
/** @var $stockItem Mage_CatalogInventory_Model_Stock_Item */
// $stockItem->setData(array()); // unneeded piece of code
$stockItem->loadByProduct($id);
if ($stockItem->getQty() == $item->getData('quantity')) {
// Valid stock
return false;
}
// Update stock
$stockItem->setQty($item->getData('quantity'));
$stockItem->save();
// End function and call function three separately, does something else
return true;
}
Chức năng 3: Mục đích cập nhật các mục chứng khoán liên quan
/**
* Update related stock items, return false if no related items are found
*
* @param Mage_Core_Model_Model_Abstract $item
* @return bool
*/
function functionThree($item)
{
$collectionOfKits = Mage::getModel('kitinventory/kitinventory')
->getCollection()
->addFieldToFilter('related_sku', $item->getData('sku')); // Check if your indexes are set on these columns
if (!$collectionOfKits->getSize()) {
// Nothing found to relate to
return false;
}
$connection = Mage::getSingleton('core/resource')
->getConnection('core_write');
// Walk kits
foreach ($collectionOfKits as $kit) {
// getData is slightly faster then getSku(unless you've implemented it in your model)
// getSku -> __call('getSku') -> get -> lowercase('sku') -> getData('sku') | note, Magento has some internal caching in this
$kitSku = $kit->getData('sku');
$kitCollection = Mage::getModel('kitinventory/kitinventory')
->getCollection()
->addFieldToFilter('kit_sku', $kitSku)
->setOrder('related_sku', 'ASC');
// Use just a fetchAll to create a fast db query
$select = $kitCollection->getSelect();
$select->reset(Zend_Db_Select::COLUMNS)
->distinct()
->columns('related_sku')
->columns('required_quantity');
// Fetch component sku
$componentSkus = $connection->fetchAll($select, 0);
// Fetch required quantity
$componentRequiredQuantity = $connection->fetchCol($select, 1);
// ...
$componentProductCollection = Mage::getModel('catalog/product')
->getCollection()
->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id = entity_id',
'{{table}}.stock_id = 1',
'left');
$componentProductCollection->addAttributeToFilter('sku', array('in' => $componentSkus));
// Next line will invoke a load on the product collection
foreach ($componentProductCollection as $component) {
$quantity = $component->getQty();
// ...
}
// You could choose to do a fetchAll here instead to get just the data you need
$connection = $componentProductCollection->getConnection();
foreach ($connection->fetchAll($componentProductCollection->getSelect()) as $row) {
// Will have a array here
$quantity = $row['quantity'];
// ... -- do not not which funky magic happens here
}
$kitId = Mage::getModel('catalog/product')
->getIdBySku($kitSku);
if (!$kitId) {
// No id
continue;
}
// You could also take a look if you can sum the stock and do a single update instead
$kitStockItem = Mage::getModel('cataloginventory/stock_item')
->loadByProduct($kitId);
$this->functionFour($kitStockItem, $kitSku, $amountOfKitsPossible);
// Or something like this, update single field
$connection->update($kitStockItem->getResource()->getMainTable(), array('qty' => $quantity), 'item_id = ' . $kitStockItem->getId());
}
return true;
}
Chức năng 4: Phải thực hiện một số dự đoán may mắn (hoặc không may mắn), vì bây giờ nó là một chức năng vô dụng, có thể được thêm vào như trong Chức năng 3.
/**
* Save stock item if changed and something else, rather not say ;-)
*
* @param Mage_Catalog_Inventory_Model_Stock_Item $kitStockItem
* @param string $kitSku
* @param int $amountOfKitsPossible Guessed it
*/
function functionFour($kitStockItem, $kitSku, $amountOfKitsPossible)
{
// ...
// Do not know the rest of the code, so I wouldn't know which I could optimize here
// If it isn't to serious, you could look at a single query and not hitting extra functions
// Check if changed
if ($quantity !=$kitStockItem->getData('qty')) {
$kitStockItem->setQty($quantity);
$kitStockItem->save();
}
// ...
}
}
functionOne($collection)
? Theo thứ tự kích thước / số lượng vật phẩm sẽ theo thứ tự nào? Có nhất thiết phải vòng qua nó để lấy SKU không?