Symfony2 में टेम्पलेट प्रतिपादन को गति कैसे करें?

मेरे पास एक symfony2 एप्लिकेशन है जो लगभग 6000 डेटाबेस इकाइयों को प्रस्तुत करता है।

मैंने ओआरएम (प्रोपेल) प्रश्नों को अनुकूलित किया और डेटाबेस अनुरोध अब बहुत तेज़ हैं। सिम्फनी नियंत्रक और टिग टेम्पलेट प्रतिपादन इंजन क्या बनी हुई है।

क्या प्रतिपादन को गति देने का कोई तरीका है (उदाहरण के लिए PHP टेम्पलेट्स पर स्विच करना?) क्या मुझे सिम्फनी प्रोफाइलर की तुलना में अधिक विस्तृत प्रोफाइलिंग जानकारी मिल सकती है?

यहां प्रोफाइलर डेटा से एक अंश दिया गया है।

symfony profiler screenshot

Edit: I profiled my code using xDebug and found that generating the objects is very expensive. Creating thousands of PHP objects from database rows in PropelObjectFormater->getAllObjectsFromRow takes most of the time.

profiler_run_excerpt

छवि उस शाखा को दिखाती है जो कंप्यूटिंग समय का 95% लेती है, जो ~ 2.8 सेकंड है। डेटाबेस पुनर्प्राप्ति ~ 0.5 सेकंड लेता है, प्रतिपादन ~ 1 सेकंड और स्वरूपण ~ 1.5 सेकंड के साथ सबसे अधिक समय लेता है।

मुझे यकीन नहीं है कि PHP वर्ग वाली फ़ाइल की लंबाई पर क्या प्रभाव पड़ता है, लेकिन प्रोपेल कोड के बहुत उत्पन्न करता है (मेरी सबसे जटिल इकाई बेस क्लास में कोड की लगभग 10k पंक्तियां होती हैं) इसलिए यह धीमा हो सकता है नीचे वस्तु निर्माण भी।

मुझे लगता है कि एक सरणी फॉर्मेटर (इस प्रकार ऑब्जेक्ट सृजन चरण को छोड़कर) का उपयोग करना एक समाधान होगा, लेकिन कुछ हद तक ओआरएम के उद्देश्य को हरा देता है।

0
असली समाधान: 6000 प्रविष्टियां प्रस्तुत न करें। लेकिन: क्या आपने Propel2 की कोशिश की है? ( github.com/propelorm/Propel2/issues/478#issuecomment-281938‌ 26 )
जोड़ा लेखक Marc J. Schmidt, स्रोत

6 उत्तर

ऐसा लगता है कि आपको PHP twig एक्सटेंशन का उपयोग करने की आवश्यकता है , जो आपकी स्थिति के लिए बनाया गया था।

दस्तावेज़ों से:

और अब से, टिग स्वचालित रूप से आपके टेम्पलेट को संकलित कर देगा   सी विस्तार का लाभ उठाएं। ध्यान दें कि यह एक्सटेंशन नहीं है   PHP कोड को प्रतिस्थापित करें लेकिन केवल एक अनुकूलित संस्करण प्रदान करता है   Twig_Template :: getAttribute() विधि।

जब मैंने अपनी परियोजना के लिए एक साल पहले कोशिश की तो मुझे व्यक्तिगत रूप से लगभग कोई दृश्य प्रभाव नहीं मिला। यदि आप इसका उपयोग करते हैं, तो कृपया अपना अनुभव साझा करें।

0
जोड़ा
मैंने XDebug प्रोफाइलर के साथ थोड़ा प्रयोग किया लेकिन ऐसा लगता है जैसे Twig_Template :: getAttribute बाधा नहीं है। मैं देखूंगा कि मेरे पास समय है और मेरा अनुभव साझा करें।
जोड़ा लेखक cw', स्रोत

6K of iterations is a lot of work.

आइडिया # 1:

क्या आप डेटा पेजिनेशन लागू कर सकते हैं? यह बहुत उचित लगता है ...

आइडिया # 2 (मोटी क्लाइंट):

कुछ <कोड> जावास्क्रिप्ट templating तंत्र लागू करें। इसके बाद आपके नियंत्रक को JS के लिए JS को वापस जाने और इसे पूरी तरह से प्रस्तुत करने के लिए वापस करना चाहिए।

यहां तक ​​कि इस स्थिति में, 6K लूप करने के लिए ब्राउज़र की गति का तेजी से पालन करना बहुत कुछ पूछना है। आपको विरामों को लागू करने की आवश्यकता होगी (जैसे, हर 150 वें पुनरावृत्ति के बाद) ताकि ब्राउजर गैर-प्रतिक्रियाशील मोड में न जाए ...

0
जोड़ा

मैंने रेडिस में दृश्य को कैश किया।

दृश्य को प्रस्तुत करते समय, Twig क्वेरी द्वारा डेटा प्राप्त करेगा, प्रतीक्षा करने में कुछ समय लगता है। तो प्रदर्शित करने का तेज़ तरीका कभी पूछताछ नहीं है। मेरी प्रोजेक्ट में, जब कुछ जगह इतनी बदली नहीं जाती है, तो मैंने नियंत्रक में renderView फ़ंक्शन का उपयोग करके उस भाग के HTML कोड को कैश किया।

0
जोड़ा

आप यहां दो प्रश्न पूछते हैं:

1) टेम्पलेट प्रतिपादन को तेज़ी से कैसे बढ़ाया जाए?

प्रोफाइलर बताता है कि प्रश्नों को प्रतिपादित किया गया है, मुझे लगता है कि आप शामिल होना भूल गए हैं, प्रतिपादन से पहले एक बड़ी क्वेरी (शायद कैच करने योग्य) निष्पादित करना बेहतर है, और केवल क्वेरी परत में क्वेरी परिणाम का उपयोग करें।

2) अधिक डिटेल्ड प्रोफाइलिंग डेटा कैसे प्राप्त करें?

मैं अनुशंसित प्रोफाइलिंग के लिए xhprof स्थापित करने का सुझाव दे सकता हूं, आप इस महान बंडल का उपयोग कर सकते हैं: https://github.com/jonaswouters/ XhprofBundle । Xhprof ट्रैक PHP कॉल और समय निष्पादन और दृश्य कॉल ग्राफ़ के आंकड़े बनाएं। मैं इसका उपयोग यह पता लगाने के लिए करता हूं कि मुझे कैश में कौन से प्रक्रिया परिणाम स्टोर करना है।

0
जोड़ा
मैं टिप के लिए धन्यवाद, Xhprof बाहर देखेंगे।
जोड़ा लेखक cw', स्रोत

जब उत्पादन मोड में, सिम्फनी 2 का ट्विग टेम्पलेट प्रतिपादन वास्तव में कैश किए गए टेम्पलेट का उपयोग करके किया जाता है, जिसका अर्थ है कि यह है एक PHP टेम्पलेट; शुद्ध PHP कोड में संकलित एक ट्विग टेम्पलेट। देव मोड में, यह निश्चित रूप से टेम्पलेट्स को कैश नहीं करता है, लेकिन इसे हर बार संकलित करता है। इसके बारे में और पढ़ें यहां दस्तावेज़ों में

यह PHP को उस डेटा को संकलित करने के लिए कुछ समय लगेगा, भले ही टेम्पलेट केवल सामान्य PHP-HTML इन्फ्यूजन कोड है जो सबसे तेज़ प्रदर्शन करता है। - आप सामान्य HTTP कैशिंग जैसे वार्निश देखना चाहते हैं, यदि यह पृष्ठ ऐसा कुछ है जो ' प्रत्येक बार डेटाबेस से होना चाहिए होना चाहिए।

प्रोफाइलिंग के लिए के रूप में। XDebug जैसी कुछ आपको Symfony2 में जो भी बनाया गया है उससे अधिक विस्तृत प्रोफाइलिंग जानकारी प्राप्त करनी चाहिए।

0
जोड़ा
XDprug को आजमाने से पहले Xhprof इंस्टॉल करना आसान है, टिप के लिए धन्यवाद। इसके अलावा, मैं उम्मीद कर रहा था कि उत्पादन मोड में, ट्विग टेम्पलेट्स को PHP फ़ाइलों में संकलित किया गया है, पुष्टिकरण के लिए धन्यवाद।
जोड़ा लेखक cw', स्रोत

@ जेपरोविक उत्तर पर बिल्डिंग:

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

डेटाबेस पक्ष पर, परिणामों को कैश करें और कैश को हर बार अक्सर तोड़ें कि यह देखने के लिए कि कोई नया डेटा है या नहीं। या यदि डेटा हर समय अद्यतित होने की आवश्यकता है: एप्लिकेशन के जो भी टुकड़े अपडेट होते हैं, डेटा भी आपके एपीआई को बताने का अनुरोध भेजेगा कि उसे कैश तोड़ना चाहिए।

0
जोड़ा