2012-05-29 12 views
9

को गति देने के लिए एक डक्ट्रिन 2 इकाई को कैश करने के लिए सहेजना मान लें कि मेरे पास Product नामक एक इकाई है और जब भी उपयोगकर्ता उत्पाद जानकारी पृष्ठ पर हिट करता है तो यह इकाई लोड होती है। आम तौर पर मैं प्रत्येक अनुरोध के लिए डीबी को मारने से बचने के लिए एक घंटे के लिए Zend_Cache (memcache) में ऑब्जेक्ट को सहेजता हूं, लेकिन जहां तक ​​मैं समझता हूं कि प्रॉक्सी ऑब्जेक्ट्स के कारण Doctrine2 इकाइयों के साथ यह संभव नहीं है।पृष्ठ लोड

तो मेरा सवाल यह है कि, मैं प्रत्येक अनुरोध के लिए डेटाबेस से एक ही इकाई को लोड करने से कैसे बच सकता हूं?

[संपादित करें]

मैं इस

$categoryService = App_Service_Container::getService('\App\Service\Category'); 
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl(); 
    $apple = $cache->fetch('apple'); 

तरह सिद्धांत कैश उपयोग करने की कोशिश लेकिन मैं निम्नलिखित त्रुटि मिलती है

चेतावनी: की आवश्यकता होती है (एप्लिकेशन/इकाई/प्रॉक्सी/_ सीजी _ /App/Entity/Category.php) [function.require]: स्ट्रीम खोलने में विफल: ऐसी कोई फ़ाइल या निर्देशिका /opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php पर लाइन 163

यह रूप में अच्छी तरह आप प्रॉक्सी वर्ग की वजह से इकाई को क्रमानुसार नहीं कर सकते हैं के रूप में

उत्तर

3

आप मिल गया है कई विकल्प Zend कैश के लिए एक ही है:

  1. उपयोग सिद्धांत के built-in result caching
  2. Zend_Cache के माध्यम से memcache में इकाई को चिपकाने का प्रयास करें। जब आप इसे खींचते हैं, तो आपको उत्पाद को ईएम में वापस मर्ज करने की आवश्यकता हो सकती है ताकि प्रॉक्सी को संदर्भित किया जा सके। यदि आप किसी भी संगठन को शामिल करते हैं जिसमें आपको उत्पाद जानकारी प्रदर्शित करने की आवश्यकता होती है, और आप केवल पढ़ रहे हैं, तो यह शॉउडल ठीक काम करता है।
  3. इकाई को कैश न करें। इसके बजाय आप जो भी आउटपुट उत्पन्न करते हैं उसे कैश करें।

संपादित: आप जलयोजन भूमि के ऊपर के बारे में परवाह नहीं है, तो आप mysql का उपयोग कर रहे हैं, और अपने उत्पाद और संबद्ध तालिकाओं जल्दी-जल्दी बदलती नहीं है, आप पसंद कर सकते हैं बस MySQL क्वेरी पर भरोसा करने की कैश। यह एक काफी धब्बा वस्तु है, लेकिन उल्लेख करने के लिए पर्याप्त उपयोगी है।

+0

1. इसके लिए काम करने के लिए, मुझे 'ढूंढ', 'findBy *', जैसे रिपोजिटरी विधियों को ओवरराइट करने की आवश्यकता है? 2. कृपया मेरा संपादन देखें। – Optimus

0

मुझे यह बेहद अजीब लगता है क्योंकि मैंने अभी इस के साथ गड़बड़ी की है और डेटाबेस में संग्रहीत प्रॉक्सी ऑब्जेक्ट के साथ कोई समस्या नहीं है। तो मुझे लगता है कि आपकी कॉन्फ़िगरेशन 100% सेटअप नहीं है?

आप अपने विन्यास के साथ समस्या मिल जाती है तो की बहुत जागरूक क्या timdev तुमने कहा हो MUST वस्तु EntityManager में वापस मर्ज वरना आप लाइन नीचे अजीब कीड़े होगा।

आपके लिए उपलब्ध एक चौथा समाधान किसी ऑब्जेक्ट के बजाय डेटा को सरणी के रूप में पुनर्प्राप्त करना भी है, लेकिन फिर निश्चित रूप से आप अपने मॉड्यूल से जुड़े सभी कार्यक्षमताओं को खो देते हैं जो शायद आप चाहते थे कि वास्तव में नहीं चाहते हैं।

0

यह मुझे कॉन्फ़िगरेशन त्रुटि की तरह लगता है।या तो प्रॉक्सी उत्पन्न नहीं हुई हैं या प्रॉक्सी निर्देशिका और नामस्थान में कुछ गड़बड़ है।

आपकी कॉन्फ़िगरेशन के आधार पर, प्रॉक्सी या तो स्वचालित रूप से या मैन्युअल रूप से जेनरेट की जा सकती है। क्या आपकी प्रॉक्सी वास्तव में App/Entity/Proxy के तहत उत्पन्न हुई है? क्या यह वास्तव में सही निर्देशिका है?

FYI करें प्रॉक्सी मैन्युअल doctrine orm:generate-proxies <dest-dir>

1

को क्रियान्वित करते हुए उत्पन्न किया जा सकता आप अपने इकाई वर्ग के लिए __sleep या __wakeup तरीकों को लागू करने की कोशिश करना चाहते हो सकता है के रूप में सिद्धांत 2 विशेष आवश्यकताओं और सीमाओं संस्थाओं की क्रमबद्धता/अक्रमांकन (जो क्या के विषय में है Zend_Cache में उन्हें संग्रहीत करते समय होता है)।

0

सेकेंडिंग क्या timdev कहता है: सिद्धांत कैशिंग में अंतर्निहित है, आप इसका उपयोग करना चाहते हैं।

यदि आप किसी भी प्रदर्शन के मुद्दों का सामना कर रहे हैं या आप अत्यधिक उत्सुक अनुकूलन का शिकार हैं तो मैं आपके प्रश्न से भी आश्चर्यचकित हूं।

संबंधित मुद्दे