php - How do you use memcached with Prepared Statements? -
नियमित एसक्यूएल प्रश्नों को कैशिंग करना काफी सरल है।
सार्वजनिक फ़ंक्शन क्वेरी ($ sql) { यदि ($ result = cache :: get (sha1 ($ sql))) {वापसी परिणाम; } $ परिणाम = $ यह- & gt; कनेक्शन- & gt; क्वेरी ($ sql); कैश :: सेट (शाए 1 ($ sql), $ परिणाम); वापसी का परिणाम; }
लेकिन आप तैयार बयानों से कैसे क्वेरी कैश करते हैं, क्योंकि आप नहीं जानते कि कथन क्या होगा जब तक कि वक्तव्य पहले ही तैयार न हो जाए और फिर डेटा बाध्य है?
$ sth = $ dbh- & gt; तैयार करें ('चुनें से * तालिका WHERE id =?'); ... बाद में ... $ sth- & gt; बाँध पैरा (1, $ आईडी); $ Sth- & gt; निष्पादित ();
मुझे लगता है कि यह एक दो-पक्ष का जवाब है: पहले, बयान प्रति-पृष्ठ स्मृति में कैश की जाती हैं (जैसे- $ a-> statements [] की एक सरणी) डेटाबेस संसाधन आईडी लंबे समय तक नहीं रहेंगी और फ़ाइलों या कुछ में संग्रहीत नहीं की जा सकती है।
दूसरा, बयान निष्पादित होने से पहले () हम परिणामों के लिए memcached / filecache में दिखते हैं। बयान ( PDOStatement :: queryString
के साथ आसान) बनाओ और दिए गए पैराम्स की हैश। मुसीबत बयान ऑब्जेक्ट में पैरामीटर पा रहा है
बेशक, यह सिर्फ एक ही विचार है और संभवत: बेहतर उपाय हैं।
ठीक है, आपको अपने प्रत्येक पैरामीटर का मान अपनी कैश कुंजी में जोड़ना होगा ऐसा कुछ:
सार्वजनिक फ़ंक्शन STMT ($ sql, $ params) {$ cache_key = sha1 ($ sql। सीरियलइज़ ($ params)); अगर ($ result = cache :: get ($ cache_key)) {return $ result; } $ Sth = $ this- & gt; कनेक्शन- & gt; तैयार ($ sql); $ I = 0; विदेशी मुद्रा ($ params के रूप में & amp; $ परम) {$ sth- & gt; बाईंदपाराम (++ $ i, $ परम); $ Sth- & gt; निष्पादित (); } अनसेट ($ परम) // सभी पंक्तियों को $ परिणाम कैश में लाएं: सेट ($ cache_key, $ result); वापसी का परिणाम; } $ Obj- & gt; stmt ('SELECT * से तालिका WHERE id =?', Array (& amp; $ id));
मैं इसे आपकी आवश्यकताओं के अनुसार इसे अनुकूलित करने के लिए छोड़ दूँगा। आपको पंक्तियों को प्राप्त करना होगा और उन्हें सरणी में संग्रहीत करना होगा।
यहां आप जिस आवरण को उपयोग करना चाहते हैं वह है:
class stmt {सुरक्षित $ sth, $ sql, $ कैश, $ params = array (); सार्वजनिक फ़ंक्शन __ रचना ($ dbh, $ sql) {$ this- & gt; sth = $ dbh- & gt; तैयार ($ sql); $ The-> gt; sql = $ sql; } सार्वजनिक समारोह बाइंडपरम ($ परम, और $ var) {$ this- & gt; पैराम्स [$ परम] = & amp; $ वर; वापसी $ इस- & gt; sth- & gt; बाईंदपाराम ($ परम, $ var); // या, यदि आप सभी args $ args = func_get_args () का समर्थन करना चाहते हैं; $ एल्ग्स [1] = & amp; $ वर; वापसी call_user_func_array (ऐरे ($ ---> बाँधपेम '), $ आर्ग्स); } सार्वजनिक फ़ंक्शन निष्पादन (सरणी $ params = null) {$ str = serialize (isset ($ params)? $ Params: $ this- & gt; पैराम्स); $ Cache_key = sha1 ($ this- & gt; sql। $ Str); // यहाँ डालें कैश तर्क ... अगर (isset ($ params)) {$ this- & gt; stmt- & gt; निष्पादित करें ($ params); } और {$ this- & gt; stmt- & gt; निष्पादित करें (); } $ This- & gt; कैश = $ this- & gt; stmt- & gt; fetchAll (); // कैश को बचाने के लिए यहां} सार्वजनिक फ़ंक्शन फ़ेच करें () {return_sift ($ this- & c; cache); }}
आपको उपयोग करने की योजना के अनुसार प्रत्येक पीडीओसेटेटमेंट विधि को मैच करना होगा। PDO :: FETCH_INTO भी लागू करने के लिए एक दर्द की तरह होगा, भी। मेरी सलाह: अपने स्वयं के उपयोग पर ध्यान केंद्रित करें शायद आपको डीबीएच स्तर पर एक कैश भी लागू नहीं करना पड़ेगा और इसके बजाय आप कैशिंग क्षमताओं को केवल उस जगह में जोड़ सकते हैं जहां यह गिना जाता है।
किसी भी दर पर, ध्यान रखें कि जितना अधिक कोड आप लिखेंगे, उतना अधिक कोड आपको बनाए रखना होगा और अधिक होने की संभावना है कि आप अपने आवेदन में कीड़े पेश करेंगे। तो एक कैशिंग परत की लागत / लाभ विश्लेषण से सावधान रहें जो अपने स्वयं के अच्छे के लिए बहुत स्मार्ट होने की कोशिश करेगी:)
Comments
Post a Comment