পারফরম্যান্স: সমস্ত পণ্যের ধরণের পণ্য তালিকা list.phtml ইনভেন্টরি স্টক স্তর যুক্ত করুন


12

টিএল; ডিআর , প্রয়োজনীয়তাটি ম্যাগান্তোর কাঠামোর সাথে মেনে চলে এমন পারফরম্যান্সের সাথে সামান্য অতিরিক্ত ক্যোয়ারী / মেমরির সাথে বিভাগের পণ্য তালিকা পৃষ্ঠায় তালিকাভুক্ত স্টক স্তরের উপস্থিতি রয়েছে।


স্কেলাবিলিটির জন্য প্রিলোডিং সম্পর্কিত বিনাই কোপসের নিবন্ধটি পড়ার পরে ।

পারফরম্যান্সের জন্য কিছু অতিরিক্ত প্রশ্ন / বোঝা সহ বিভাগের তালিকা তালিকা পাতাগুলিতে ( list.phtml ) ইনভেন্টরি স্টক স্তরগুলি অন্তর্ভুক্ত করার সর্বোত্তম উপায় কী ?

আমি কয়েকটি পদ্ধতির সম্পর্কে অবগত:

পরে লোড ()media_gallery অতিরিক্ত জিজ্ঞাসা ছাড়াই অন্তর্ভুক্তিরসাথে ভালভাবে কাজ করছে বলে মনে হচ্ছে, তবে আমি জায়ের সাথেএকই পদ্ধতির প্রয়োগ করতে সফল হইনি।

$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);

সরাসরি SQL এর একটি সঙ্গে সংগ্রহে সমান্তরাল প্রয়োজন ডেটা একত্রিত করতে product_idউদাহরণস্বরূপ কী। তবে কাঠামোর মাধ্যমে আরও কিছু সন্ধান করছেন।

বর্তমানে আমি কেবল এর stock_itemমাধ্যমে অবজেক্টটি লোড করছি :

$_product->load('stock_item')->getTotalQty(); কোনটি কাজ করে তবে সংগ্রহের সমস্ত পণ্যের ইনভেন্টরি স্টক মোট পেতে আরও প্রশ্নের সংযোজনটি আমি লক্ষ্য করি।

...

__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)

...

আশ্চর্যজনকভাবে, এটি কাজ করে। ম্যাজিকটি ম্যাজ_ইভ_মোডেল_এন্টিটি_ অ্যাবস্ট্র্যাক্ট-> লোড ($ অবজেক্ট, $ অ্যান্টি আইড, $ অ্যাট্রিবিউটস) এ ঘটে। যদি $ বৈশিষ্ট্যগুলি খালি থাকে তবে এটি লোডআলঅ্যাট্রিবিউট ($ অবজেক্ট) কল করবে। সুতরাং $ পণ্য-> লোড ('ব্লাহ') 'মিডিয়া_গ্যালারি' সহ সমস্ত অনুপস্থিত বৈশিষ্ট্যগুলি লোড করবে - উইলিয়াম ট্রান নভেম্বর 19 '14 4:45 এ

ইতিমধ্যে লোড হওয়া সংগ্রহে প্রয়োজনীয় মান যুক্ত করুন।

স্তর / ফিল্টারে শীর্ষ স্তরের উত্পাদন সংগ্রহের জন্য প্রয়োজনীয় ডেটা যুক্ত করার সুস্পষ্ট সহজ পন্থাটি সর্বোত্তম পদ্ধতির বলে মনে হবে।

আমি একটি পর্যবেক্ষক অ্যাডভেন্টরিডাটাটোকলকশন () লক্ষ্য করে দেখলাম যে ম্যাজে_গ্লাগালিয়াল ইনভেন্টরি_মোডেল_অবজারবারে মনে হয় যে এটি এরূপ অর্জন করবে তবে কাস্টম মডিউল পর্যবেক্ষকের সাথে পদ্ধতিটি যুক্ত করা সামঞ্জস্যপূর্ণ বলে মনে হয় না।

<events>
    <catalog_product_collection_load_after>
        <observers>
            <inventory>
                <class>cataloginventory/observer</class>
                <method>addInventoryDataToCollection</method>
            </inventory>
        </observers>
    </catalog_product_collection_load_after>
</events>

যার ফলাফল:

সতর্কতা: / অ্যাপ্লিকেশন / কোড / কোর্টে / ম্যাজ / কেটলগ্যালস ইনভেন্টরি / মডেল / রিসোর্স / স্টক / আইটেম / সংকলন.এফপি 71-তে ফোরচ () এর জন্য অবৈধ যুক্তি সরবরাহ করা হয়েছে


1
ভাল প্রশ্ন বুমার
অমিত বেরা

উত্তর:


4

এখানে আসল সমস্যাটি প্রিলোডিং নয়, এটি যথার্থতা। পণ্য সংগ্রহের জন্য শেয়ারের পরিমাণ পাওয়া তুলনামূলকভাবে সহজ:

$products = Mage::getModel('catalog/product')->getCollection()
    ->addCategoryFilter($_category);
$stockCollection = Mage::getModel('cataloginventory/stock_item')
    ->getCollection()
    ->addProductsFilter($products);

এখন দুটি প্রশ্নের সাথে আপনার কাছে আপনার প্রয়োজনীয় সমস্ত তথ্য রয়েছে। একে অপরের সাথে সম্পর্ক স্থাপন করা তাদের পক্ষে শক্ত 'product_id' => 'stock'। এছাড়াও, অ্যাডপ্রোডাক্টস ফিল্টারটি অনুকূলিত করা যেতে পারে:

public function addProductIdsFilter(array $productIds)
{
    if(empty($productIds) {
        $this->_setIsLoaded(true);
    }
    $this->addFieldToFilter('main_table.product_id', array('in' => $productIds));
    return $this;
}

এটি আপনাকে টাইপ চেক এবং অ্যারে ক্লোনিং সংরক্ষণ করে।

এখন সমস্যাটি হ'ল এইচটিএমএল ক্যাশে। এতে থাকা কোনও পণ্যের উপর কোনও স্টক আপডেট হলে এই বিভাগের পৃষ্ঠাটি মুছে ফেলা দরকার। যতদূর আমি জানি, এটি স্ট্যান্ডার্ড নয়, যেহেতু কেবলমাত্র স্টকের স্থিতি পরিবর্তন কোনও পণ্য (বা আরও সঠিকভাবে, একটি দৃশ্যমান পরিবর্তন) সমেত একটি বিভাগের পৃষ্ঠা মুছে দেয়। সুতরাং আপনাকে cataloginventory_stock_item_before_saveএই বিভাগের পৃষ্ঠার জন্য কমপক্ষে এবং সম্ভবত কয়েকজনকে পর্যবেক্ষণ করতে হবে এবং ব্লক এইচটিএমএল ক্যাশে (এবং এফপিসি ক্যাশে) পরিষ্কার করতে হবে।


আপনার চূড়ান্ত পয়েন্ট হ'ল স্টক ডেটা পুনরুদ্ধার করার জন্য আমরা অতিরিক্ত অনুরোধ করতে গিয়েছিলাম। দ্রুত চলমান পণ্যগুলির সাথে বিভাগগুলি থাকলে আপনি ক্যাশে এর বেশিরভাগ সময় ফ্লাশ / অবৈধ হওয়ার জন্য ব্যয় করবেন। আমাদের কেবলমাত্র কোনও বিভাগের পৃষ্ঠা ক্যাশে মুছে ফেলতে হবে যদি কোনও পণ্য সেই বিভাগ থেকে সরানো হয়। কেস ভিত্তিতে কোনও মামলার সর্বাধিক দক্ষ প্রয়োগের জন্য আপনাকে কাজ করতে হবে এমন কোনও ম্যাজিক সমাধান নেই। যদি আপনি চান আপনি স্টক ডেটা ক্যাশে করতে পারেন তাই কেবলমাত্র পুরো পৃষ্ঠার চেয়ে ফ্লাশের পরে পুনর্নির্মাণ করতে হবে।
জন-জে

আপনি যদি এখন স্টক ডেটাটি ডিওএম আপডেট করার জন্য জাভাস্ক্রিপ্ট ডেটা ব্যবহার করে আপনি ঠিক তেমনভাবে প্রয়োগ করেন তবে আপনি লিখতে পারেন যে এটির নিজস্ব ক্যাশে কী সহ একটি ব্লক ব্যবহার করে এবং কেবল স্টক ডেটাটিকে অকার্যকর করে দেয়। আপনার পরিস্থিতির জন্য আমি এটি কীভাবে করব এবং কোনও ESI ভিত্তিক এফপিসি ব্যবহার করব না, তবে অনুরোধ প্রসেসরের পঞ্চ ব্লকগুলিকে ছিদ্র করতে পারে। কেবল রাউটার বিটের জন্য নয়, প্রতি পৃষ্ঠায় কেবল একটি পিএইচপি ইন্টারপ্রেটারের প্রয়োজন রয়েছে। যখন কোনও কারণেই কোনও মেশিন চাপে আসে তখন আপনার পিএইচপি ইন্টারপ্রেটার সবচেয়ে সিপিইউ নিবিড় সংস্থান। এটি সপ্তাহান্তে একটি চমৎকার প্রকল্পের মতো আরও বেশি
শোনানো

3
এটি এমন ধরণের জিনিস যা কাজটিকে সত্যিই আকর্ষণীয় করে তোলে যেখানে আপনাকে বাস্তবায়ন এবং সম্ভাব্য সমস্যা এবং বাধা সম্পর্কে সত্যিই চিন্তা করতে হবে। আমি এই মুহুর্তে একক পিএইচপি প্রক্রিয়াটি নিয়ে কোথা থেকে আসছি তা অবজ্ঞাপূর্ণভাবে দেখছি এটি আমাদের পক্ষে কোনও সমস্যা নয় তবে আপনি যখন স্কেল করবেন তখন এটি কীভাবে প্রভাব ফেলবে তা দেখতে পাচ্ছি। পৃষ্ঠায় প্রদর্শিত স্টক মানগুলি সমালোচনামূলক কার্যকারিতা নয় তাই ব্যবহারকারীকে প্রভাবিত না করেই আমরা লোডের পরে এটি গৌণ সংস্থান হিসাবে লোড করি। এটি পণ্য তালিকার একটি লজ্জাজনক স্টক যা কোনও ডিফল্ট বৈশিষ্ট্য নয়।
জন-জে

1
হ্যাঁ, রেডিস থেকে সরাসরি এনে সরাসরি পিএইচপি কেটে ফেলার জন্য আমি এখন এই ধারণার সাথে খেলছি। খোলা বিশ্রামে ইয়েচুন জাংয়ের এখানে কিছু সত্যিই আকর্ষণীয় কাজ রয়েছে
মেলভিন

2

আমি দেখতে পেয়েছি আপনি ইতিমধ্যে গ্রহণ করেছেন এবং কোনও সন্দেহ নেই এখন অবধি কিছু কার্যকর করেছেন, তবে আপনি কতটা কাছাকাছি ছিলেন তা আমি উল্লেখ করতে চাই তবে addInventoryDataToCollection()দেখে মনে হচ্ছে আপনি কনফিগার ফাইলটি ভুলভাবে চিহ্নিত করেছেন বা আমরা ম্যাজেন্টোর বিভিন্ন সংস্করণ ব্যবহার করছি। আমার অনুলিপিটির জন্য CatalogInventory/etc/config.xmlআলাদা পদ্ধতি বলা হয়েছেcatalog_product_collection_load_after

 <catalog_product_collection_load_after>
    <observers>
        <inventory>
            <class>cataloginventory/observer</class>
            <method>addStockStatusToCollection</method>
        </inventory>
    </observers>
 </catalog_product_collection_load_after>

addInventoryDataToCollection() বলা হয় <sales_quote_item_collection_products_after_load>

এর উত্স addStockStatusToCollection()হ'ল:

public function addStockStatusToCollection($observer)
{
    $productCollection = $observer->getEvent()->getCollection();
    if ($productCollection->hasFlag('require_stock_items')) {
        Mage::getModel('cataloginventory/stock')->addItemsToProducts($productCollection);
    } else {
        Mage::getModel('cataloginventory/stock_status')->addStockStatusToProducts($productCollection);
    }
    return $this;
}

require_stock_itemsসংগ্রহের লোড হওয়ার আগে আপনি পতাকাটি সেট করতে পারেন , বিভাগ তালিকার পিছনে থাকা ব্লকের পক্ষে সম্ভবত এটি এতটা সহজ নয়, বা আপনি Mage::getModel('cataloginventory/stock')->addItemsToProducts($productCollection)ইতিমধ্যে সংগ্রহের পরে ম্যানুয়ালি কল করতে পারেন it's addItemsToProducts()আপনার জন্য সমস্ত স্টক আইটেম পায় এবং সেগুলি আপনার পণ্য সংগ্রহের সাথে সংযুক্ত করে

public function addItemsToProducts($productCollection)
{
    $items = $this->getItemCollection()
        ->addProductsFilter($productCollection)
        ->joinStockStatus($productCollection->getStoreId())
        ->load();
    $stockItems = array();
    foreach ($items as $item) {
        $stockItems[$item->getProductId()] = $item;
    }
    foreach ($productCollection as $product) {
        if (isset($stockItems[$product->getId()])) {
            $stockItems[$product->getId()]->assignProduct($product);
        }
    }
    return $this;
}

1

আপনি কি আদৌ ওয়ার্নিশ বা এফপিসি ব্যবহার করছেন, বা ভবিষ্যতে পরিকল্পনা করছেন?

আমরা পণ্যের তালিকার জন্য প্রয়োজনীয় পরিমাণ গর্ত পাঞ্চ / ইএসআই অনুরোধ পেয়েছি যা এটির পরিবর্তে ভিন্ন পদ্ধতির জন্য বেছে নেওয়া জায়গায় ক্যাশে রাখার পক্ষে উপযুক্ত ছিল না।

আমরা একটি ওয়েবসাইটে এমন একটি সমাধান প্রয়োগ করেছি যা পণ্যগুলির স্টক ডেটা পুনরুদ্ধার করতে একটি কাস্টম নিয়ন্ত্রকের কাছে একটি এজেএক্স অনুরোধ ব্যবহার করে এবং জাভাস্ক্রিপ্টটি ডোম আপডেটগুলি পরিচালনা করে। স্টক ডেটার জন্য অতিরিক্ত অনুরোধে 100 মিলিয়ন ডলার লাগে যা সামগ্রিকভাবে (দৃশ্যমান) পৃষ্ঠা লোড সময়কে প্রভাবিত করে না। দম্পতি যা প্রাইমড এফপিসি পৃষ্ঠার অনুরোধটি 100 মিমি এর নিচে নামিয়ে দিচ্ছে আপনার কাছে পণ্য তালিকায় স্টক ডেটা প্রদর্শনের জন্য কম পারফরম্যান্স ওভারহেড সহ একটি দ্রুত সাইট রয়েছে।

আপনার টেমপ্লেট অনুসারে যা করতে হবে তা হ'ল প্রতিটি পণ্য র‌্যাপার এইচটিএমএলতে প্রোডাক্ট যুক্ত করুন যাতে আপনার জাভাস্ক্রিপ্ট জানে যে প্রতিটি পণ্যের জন্য কোন স্টক ডেটা প্রয়োগ করতে হবে।

আপনি যদি প্রকৃত স্টক ডেটার জন্য অতিরিক্ত ক্যাচিং কৌশলগুলি দেখেন তবে আপনি প্রতিটি অনুরোধে ডেটাবেসকে হস্তান্তর / হিট না করে 100 মিমির নীচে থেকে ভালভাবে ফেলে দিতে পারেন।

দুঃখিত, এটি আপনি যা সন্ধান করছেন তার লাইনের সাথে না থাকলেও আমরা আমাদের প্রয়োজনীয়তার বিপরীতে স্কেলাবিলিটি এবং পারফরম্যান্সের জন্য এটি সেরা পদ্ধতির বলে মনে করেছি।


2
বিশৃঙ্খলা বানর স্থাপন করুন এবং দেখুন যখন আপনার ক্যাশে সঞ্চয়স্থান শেষ হয় তখন কী ঘটে। প্রশ্নটিতে বিশেষভাবে ক্যাশে নির্ভর না করার কথা উল্লেখ করা হয়েছে। এটি এর মতো উত্তর যা কোনও ক্লায়েন্টকে বোঝানোর জন্য আমাদের কাজ তৈরি করে যে এফপিসি তাদের বিল্ট ইন / মমসবেসেমেন্ট টেম্পলেটটি এত শক্ত করে না।
মেলভিন

আপনি যদি মনে করেন আমি পারফরম্যান্সের জন্য এবং সমাধান হিসাবে এফপিসি / বার্নিশের পরামর্শ দিচ্ছি তবে আপনি সত্যিই আমার উত্তরটি ভুল বুঝবেন। আমি বলেছি যে তারা যদি এফপিসি ব্যবহার করে বা বিবেচনা করছে তবে তাদের গর্তের খোঁচা / ইএসআই অনুরোধগুলি হ্রাস করার জন্য এই পদ্ধতির তদন্ত করা উচিত। ক্যাশ ছাড়াই ছাড়াই আমরা 100 মিমি এর নীচে প্রয়োজনীয় স্টক ডেটা পাচ্ছি।
জন-জে

এবং আপনি একই সময়ে ESI ব্যবহার করে একই ডেটা পাবেন। ESI এর সাথে আপনার দৃষ্টিভঙ্গি কেবল মৌলিকভাবে পৃথক। এবং সুতরাং, কোনও ক্যাশে ছাড়াই আপনি কম সময়ে একই ডেটা পেতে পারেন। JSON কে ফেরত পাঠানোর জন্য আর একটি রাউটারের মধ্য দিয়ে যাওয়ার পরিবর্তে, আপনি জাভাস্ক্রিপ্টে একটি স্টক অ্যারে লিখুন যা ডোম ইত্যাদি আপডেট করে Hell
মেলভিন

1
ক্যাচিং ব্যবহার করা হচ্ছে তবে প্রশ্নটি পারফরম্যান্স অপটিমাইজেশনের লাইন বরাবর বেশি। কিছু ব্যাকগ্রাউন্ড: magento.stackexchange.com/questions/13957/… (কোন ক্যাশে / খুব কমই কোনও নেই) তবে উত্তরের জন্য ধন্যবাদ , ইনপুটটির প্রশংসা করুন!
B00MER

এম 2-তে এটি করার কোনও "সেরা অনুশীলন" পদ্ধতি আছে কিনা তা নিশ্চিত নন, তবে আপনার সমাধান হ'ল ম্যাজেন্টো 1.x থেকে আমরা কীভাবে সর্বদা এটি করেছি done
thdoan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.