2011-02-02 21 views
8

मुझे वास्तव में कैशिंग के साथ कोई अनुभव नहीं है, इसलिए यह एक बेवकूफ सवाल जैसा प्रतीत हो सकता है, लेकिन आप कैसे जानते हैं कि आपके डेटा को कैश करना है? मैं इस बारे में बात करने वाली एक साइट को खोजने में भी सक्षम नहीं था, लेकिन यह मेरे खोज कौशल या शायद कई चरों पर विचार करने के लिए हो सकता है?PHP एपीसी कैश करने या कैश करने के लिए नहीं?

मैं सबसे अधिक संभावना एपीसी का उपयोग कर रहा हूं। क्या किसी के पास कोई उदाहरण है कि इसे कैश करने के लिए आपको कम से कम डेटा की आवश्यकता होगी? उदाहरण के लिए, मान लें कि आपके पास 100 आइटम के साथ एक सरणी है और आप उस पर फ़ोरैच लूप का उपयोग करते हैं और कुछ सरल सरणी हेरफेर करते हैं, क्या आपको परिणाम कैश करना चाहिए? इसके बारे में अगर उसके पास 1000 आइटम, 10000 आइटम आदि थे?

आप अपने डेटाबेस क्वेरी के परिणामों कैशिंग किया जाना चाहिए? कैशिंग कैसा होना चाहिए? मैं एक साधारण चयन मानता हूं और शायद एक जोड़े को एक MySQL डीबी में कथन में शामिल होने की आवश्यकता नहीं है, या यह करता है? मान लें कि mysql क्वेरी कैश चालू है, क्या इसका मतलब है कि आपको एप्लिकेशन परत में कैश करने की आवश्यकता नहीं है, या फिर भी आपको यह करना चाहिए?

आप किसी ऑब्जेक्ट का दृष्टांत हैं, तो आप यह कैश चाहिए? यह निर्धारित करने के लिए कि क्या इसे कैश किया जाना चाहिए या नहीं? तो कैश करने के लिए एक सामान्य गाइड अच्छा होगा, उदाहरण भी वास्तव में सहायक होंगे, धन्यवाद।

उत्तर

10

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

तुम भी कैश में स्थान उपयोग के बारे में पता होना चाहिए। अधिकांश कैश एक निश्चित आकार होते हैं और आप उन्हें ओवरफिल नहीं करना चाहते हैं ... इसलिए डेटा का बड़ा वॉल्यूम स्टोर करने के लिए उनका उपयोग न करें। कैश उपयोग की निगरानी के लिए एपीसी के साथ उपलब्ध apc.php स्क्रिप्ट का उपयोग करें (हालांकि सुनिश्चित करें कि यह किसी के लिए सार्वजनिक रूप से सुलभ नहीं है और आपकी साइट तक पहुंचने वाले सभी लोग .... खराब सुरक्षा)।

जब कैश में वस्तुओं पकड़े, वस्तु श्रृंखलाबद्ध किया जाएगा() जब यह संग्रह किया गया है, और unserialized() जब यह लिया गया है, इसलिए वहाँ एक ओवरहेड है। संसाधन विशेषताओं वाले ऑब्जेक्ट्स उस संसाधन को खो देंगे; इसलिए अपने डेटाबेस एक्सेस ऑब्जेक्ट्स को स्टोर न करें।

यह समझदार केवल जानकारी है कि नहीं बल्कि उपयोगकर्ता-विशिष्ट डेटा की तुलना में, कई/सभी उपयोगकर्ताओं द्वारा पहुँचा जा सकता है स्टोर करने के लिए कैश का उपयोग करने के लिए है। उपयोगकर्ता सत्र जानकारी के लिए, सामान्य PHP सत्रों के साथ चिपके रहें।

+4

@ जोकर बस थोड़ा एडन के रूप में, आप को पहले से ही पता नहीं है, एपीसी 2 प्रकार का कैश प्रदान करता है, एक ओपोड कैश आंतरिक रूप से 'इसे तेज बनाने' के लिए PHP द्वारा उपयोग किया जाता है, और उपयोगकर्ता कैश जिसे आप स्टोर करने के लिए उपयोग कर सकते हैं डेटा। उपयोगकर्ता कैश वह हिस्सा है जिसकी आपको आवश्यकता होगी। (क्षमा करें अगर यह लोगों को अंडे चूसने के लिए सिखा रहा है - लेकिन उम्मीद है कि यह उन लोगों के लिए उपयोगी हो सकता है जो इस प्रश्न में आते हैं) –

+0

हाँ, मुझे ओपोड कैश से अवगत है जो आपके पास एपीसी सक्षम होने पर स्वचालित रूप से काम करता है। जब आप कहते हैं कि आपको यह देखने के लिए परीक्षण करना चाहिए कि डेटाबेस या कैश से प्रश्नों को तेज़ी से पढ़ा जाता है, तो मैं इसका परीक्षण कैसे करूं? और मुझे केवल नियमित डेटा कैशिंग कब करना चाहिए? उदाहरण के लिए मेरे foreach पाश उदाहरण। – Joker

+0

@ जोकर - परीक्षण करने का तरीका वास्तव में कोशिश करना है (दोनों विधियों का उपयोग करना) और समय को मापना ... कोई पूर्ण गणित नहीं है जो आपको पहले से बता सकता है, हालांकि आपके डेटाबेस प्रश्नों पर EXPLAIN का उपयोग करने से कुछ संकेत मिल सकते हैं। याद रखें कि आपको हमेशा अपने डेटाबेस पर सर्वोत्तम इंडेक्स सुनिश्चित करना चाहिए। न ही आपके लूप उदाहरण के लिए कोई "कठोर और तेज़" नियम है ... यह ऐसा कुछ है जिसे मामले के आधार पर किसी मामले पर मूल्यांकन किया जाना है। मैं बस इतना कह सकता हूं कि "केवल कैशिंग के लिए कैश न करें", केवल वास्तविक, मापनीय लाभ होने पर ऐसा ही करें। –

0

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

इसके बाद, आप की पहचान करने के लिए क्या विशेष रूप से सुस्ती का कारण है। आपने माना है कि आपका एप्लिकेशन कोड स्रोत था, लेकिन यह जांचने लायक है कि बड़े पृष्ठ फ़ाइल आकार, अत्यधिक अनुरोध, कोई gzip इत्यादि जैसे अन्य बाहरी कारक हैं। http://tools.pingdom.com/ जैसी साइट का उपयोग करें या इसके लिए शुरुआत के रूप में yslow जैसे एक्सटेंशन का उपयोग करें। (त्वरित टिप सुनिश्चित करें कि रखरखाव और gzip काम कर रहे हैं)।

समस्या का मानना ​​आपके आवेदन कोड के निष्पादन की अवधि है, आप xdebug (http://www.xdebug.org/) जैसे कुछ के साथ अपना कोड प्रोफाइल करना चाहते हैं और आउटपुट को केकेचेग्रींड या wincachegrind के साथ देखना चाहते हैं । यह आपको बताएगा कि आपके कोड के कौन से हिस्से लंबे समय तक चल रहे हैं। वहां से आप कैश करना चाहते हैं और कैश कैसे करें (या अपने कोड के तर्क में सुधार करें) पर निर्णय लेंगे।

समस्या क्या हो सकती है और संबंधित समाधानों के लिए इतनी सारी संभावनाएं हैं कि यह अनुमान लगाने योग्य नहीं है। इसलिए, एक बार जब आप समस्या की पहचान कर लेंगे तो आप उस विशिष्ट समस्या को हल करने के लिए संबंधित एक नया प्रश्न पोस्ट करना चाहेंगे। मैं कहूंगा कि अगर सही तरीके से उपयोग नहीं किया जाता है, तो MySQL क्वेरी कैश उत्पादक काउंटर हो सकता है। इसके अलावा, मैं आम तौर पर memcached के पक्ष में एपीसी उपयोगकर्ता कैश से बचें।

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