2012-03-25 13 views
8

बस in this topic की तरह, मेरे ऐप में एक ट्रिग "रेंडर" टैग जोड़ते समय मेरे पास dev मोड में एक प्रदर्शन समस्या है (संबंधित दस्तावेज़: Embedding controllers)।Symfony2 और Twig प्रदर्शन समस्याओं को प्रस्तुत करते हैं

इस रेंडर टैग के बिना, मेरे पृष्ठ 70 एमएस से कम में उत्पन्न होते हैं। रेंडर टैग के साथ, यह कम से कम 170 एमएस है। और ऐप में जोड़े गए प्रत्येक रेंडर टैग में पेज पीढ़ी 100 एमएस तक बढ़ जाती है (जो एक एलओटी है: सामान्य पृष्ठ 60 एमएस में क्यों चलता है और 100 एमएस में रेंडर टैग क्यों होता है?)। मुझे अपने ऐप के प्रत्येक पृष्ठ पर 4 या 5 की आवश्यकता हो सकती है, ताकि इसका मतलब देव मोड में प्रत्येक पृष्ठ के लिए कम से कम 500 एमएस हो।

मैं पूरी तरह से समझता हूं कि प्रोड मोड में कोई समस्या नहीं है, लेकिन यह स्पष्ट रूप से विकास में सहज नहीं है। तो, क्या किसी को देव मोड में "रेंडर" टैग का उपयोग करते समय किसी भी बेकार कॉल, लॉग या कोड से छुटकारा पाने के लिए किसी भी तरह से पता है?

उत्तर

8

मेरे पास explained है जो इसे केवल 10 घंटे पहले है। लंबी कहानी छोटी: टवीग एक्सटेंशन में माइग्रेट करें।

+2

इस मामले में नियंत्रक तर्क के लिए एक सेवा बनाना बेहतर IMHO है। यदि नियंत्रक तर्क में डीबी ऑपरेशन है तो मुझे लगता है कि लॉजिक फ़ंक्शन में तर्क को स्थानांतरित करना बेहतर नहीं है। एक अलग सेवा बनाना भी पुन: प्रयोज्यता सुनिश्चित करता है अगर एम्बेडेड नियंत्रक मार्ग संलग्न है और उसे स्वतंत्र रूप से बुलाया जा सकता है। –

+0

कुछ भी आपको टवीग एक्सटेंशन से सेवाओं को कॉल करने से रोकता है। वास्तव में, मैं यही करता हूं। यह एक वीएस-वह समस्या नहीं है। मेरे Twig एक्सटेंशन केवल सेवाओं के रूप में परिभाषित नियंत्रकों के कार्यों को बुलाओ। उन कार्यों को Twig एक्सटेंशन के बिना पुन: प्रयोज्य कर रहे हैं। –

+1

अच्छी तरह से सेवा 'ऐप/config.yml' में twig वैश्विक चर जोड़कर जुड़वां के संपर्क में भी आ सकती है। चीजों को पूरा करने के लिए बस अलग रास्ता। वास्तव में बहस करने के लिए कुछ भी नहीं :)। –

6

आप अपने नियंत्रक तर्क को किसी सेवा में ले जा सकते हैं और इसे वैश्विक वैश्विक चर के रूप में संदर्भित कर सकते हैं और फिर नियंत्रक द्वारा प्रदान किए गए टेम्पलेट को शामिल कर सकते हैं।

निर्देशों के लिए https://stackoverflow.com/a/13245994/982075 देखें।

8

सिम्फनी में मेरी पसंदीदा सुविधाओं में से एक रेंडर टैग है, नियंत्रक कॉल एम्बेडिंग। प्रोफाइलर प्रत्येक नियंत्रक कॉल के लिए बहुत अधिक ओवरहेड जोड़ता है, न केवल गति बल्कि बहुत सारी मेमोरी का उपयोग करता है। आपके पास इसे तेज करने के लिए कुछ विकल्प हैं।

प्रोफाइलर डिफ़ॉल्ट रूप से प्रत्येक डेटा को SQLite डेटाबेस में लिखता है। आईआईआरसी स्क्लाइट समानांतर आवेषण की अनुमति नहीं देता है, इसलिए प्रत्येक अनुरोध को डेटा कलेक्टरों को फ्लश करने के लिए डीबी तक पहुंचने के लिए उनकी बारी का इंतजार करना पड़ता है। आप प्रोफाइलर डेटा को बनाए रखने के लिए अपने विकास डीबी (mysql या जो भी आप उपयोग करते हैं) का उपयोग कर सकते हैं। एक साल पहले मैंने गति के मामले में इसके साथ बहुत कुछ हासिल किया था।

आप उप अनुरोधों के लिए प्रोफाइलर को भी अक्षम कर सकते हैं, या अपवाद होने पर केवल प्रोफाइलर का उपयोग कर सकते हैं। पूर्ण विवरण के लिए the framework config reference देखें।

# config_dev.yaml 
framework: 
    profiler: 
     only_exceptions:  false 
     only_master_requests: false 
     dsn:     sqlite:%kernel.cache_dir%/profiler.db 
+0

मेरे पास render_esi() का उपयोग कर prbl था; इस मामले में @ m2mdas समाधान व्यवहार्य नहीं है। – lrkwz

+0

यह सुनिश्चित करने के लिए एक दिलचस्प चाल है :-) – MauganRa

2

विकल्प आपके आवेदन पर निर्भर करता है। मेरा मानना ​​है कि सबसे व्यावहारिक तरीके हैं:

1) भारी रेंडर किए गए टेम्पलेट्स के लिए render टैग का उपयोग करें और hinclude लाइब्रेरी का उपयोग अतुल्यकालिक तरीके से लोड करने के लिए करें। यह बहुत उपयोगी होता है जब प्रत्येक टेम्पलेट को प्रस्तुत किया जा सकता है (जैसे कई डीबी कनेक्शन, बड़े ग्रंथ, इत्यादि)।

2) m2mdas द्वारा प्रस्तावित अनुसार करें। यह आम मामलों के लिए एक बहुत तेज़ समाधान है।

0

मैं जुड़वां एक्सटेंशन के साथ एलनूर के सुझाव का भी पालन करता हूं। सोनाटा ब्लॉक बंडल का उपयोग करने का एक विकल्प होगा: http://sonata-project.org/bundles/block/master/doc/index.html। सोनाटा ब्लॉक के साथ एक उप-अनुरोध का उपर लगभग 7 एमएमएस है।

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