2012-12-07 19 views
5

सारांश:CodeIgniter (पूर्व नियंत्रक) हुक और कैशिंग

पूर्व नियंत्रक हुक कैशिंग के दौरान अमल करते हैं? क्या कोई हुक-पॉइंट है जो निष्पादित करेगा? (प्री-सिस्टम?)

मुझे शायद इस तथ्य को हाइलाइट करना चाहिए कि हुक ब्राउज़र पर भेजी गई सामग्री को प्रभावित नहीं करता है। यह कोई मुद्दा नहीं है।


विस्तृत संस्करण:

मैं एक परियोजना मैं PHP और CodeIgniter का उपयोग कर का निर्माण किया है में कुछ आंकड़े प्रकार कार्यक्षमता को लागू करने की योजना है।

प्रश्न में परियोजना एक कस्टम निर्मित सीएमएस है - अपडेट के बीच विस्तारित अंतराल के कारण मैंने लोड समय को तेज करने में मदद करने के लिए कैशिंग का उपयोग किया है; यह आवश्यक नहीं है लेकिन यह अधिमान्य है। यह काफी हद तक स्थिर साइट के लिए एक अच्छा समाधान प्रतीत होता है; खासकर जहां गतिशील सामग्री मुख्य रूप से क्लाइंट-साइड - i.e AJAX अनुरोधों की सेवा की जाती है।

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

मैंने Web Page Caching पर दस्तावेज़ों के साथ-साथ documentation regarding hooks पर प्रलेखन के माध्यम से पढ़ा है। दुर्भाग्यवश, यह अभी भी स्पष्ट नहीं है कि कैशिंग का उपयोग पूरी तरह से हुक को बाईपास करेगा।

मुझे cache_override से अवगत है हालांकि इसका मतलब है कि आप अपने कैशिंग तंत्र को लागू कर रहे हैं; मैं क्या नहीं करना चाहता!

विकल्प सांख्यिकी क्लाइंट पक्ष एकत्रित करेगा और इसे AJAX के माध्यम से सर्वर पर सबमिट करेगा; लेकिन यह आदर्श नहीं है क्योंकि मैं तर्क के स्पष्ट पृथक्करण की कोशिश कर रहा हूं - रखरखाव और परीक्षण कारणों से।

+0

यदि सप्ताहांत में इसका उत्तर नहीं मिलता है तो मैं कुछ परीक्षण मामलों को सीआई स्रोत कोड में एक डिलीव लिखूंगा और –

उत्तर

10

संक्षेप में:

  • पूर्व नियंत्रक हुक कैशिंग के दौरान अमल करते हैं? नहीं
  • क्या कोई हुक-पॉइंट निष्पादित होगा? हांpre_system निष्पादित करता है।

तो system/core/CodeIgniter.php:189 पर कैशिंग किक, केवल हुक कि चलाने के लिए एक मौका हो जाता है pre_system (system/core/CodeIgniter:124) है।

दुर्भाग्यवश आपको उस बिंदु पर कोडनिर्देशक की अधिक कार्यक्षमता नहीं मिलती है, get_instance() और इसके बिना अधिकांश मूल पुस्तकालय भी लोड नहीं होते हैं। यदि आप इच्छुक हैं तो आप देख सकते हैं कि system/core/Common.php के अंदर कौन से फ़ंक्शंस परिभाषित किए गए हैं जो आपके पास बहुत अधिक है।

तुम सच के साथ इस काम करने के लिए चाहते हैं, तो बनाया कक्षाओं में आप तरह के एक डेटाबेस वस्तु और इस तरह अन्य महत्वपूर्ण सामान के लिए अपना रास्ता लड़ाई कर सकते हैं:

  1. आप मैन्युअल BASEPATH.'database/DB.php' प्राप्त करना होगा फ़ाइल में शामिल हैं। सौभाग्य से लोडर वर्ग में, यह require_once के साथ लोड हुआ है, इसलिए यह कैश मिस पर पृष्ठ को नहीं तोड़ देगा।
  2. एक बार जब आपको Database लाइब्रेरी लोड हो गई तो ऑब्जेक्ट को DB() पर कॉल करने के साथ तुरंत लोड किया गया। पैरामीटर के बिना यह सामान्य रूप से कॉन्फ़िगरेशन फ़ाइलों से डिफ़ॉल्ट डेटाबेस लोड करेगा।
  3. इस बिंदु पर आप अपने प्रश्नों को अपने pre_system हुक से लिख सकते हैं, और चूंकि हुक ऑब्जेक्ट्स हो सकते हैं, इसलिए आप प्रत्येक लॉगिंग कोड को हुक के ऑब्जेक्ट में ले जा सकते हैं। यदि आपको अन्य पुस्तकालयों की आवश्यकता है तो आप load_class() फ़ंक्शन के साथ उनका उदाहरण प्राप्त कर सकते हैं (यदि आप कक्षा में निर्मित नहीं हो रहे हैं तो खाली स्ट्रिंग पर तीसरा उपसर्ग पैरामीटर सेट करना न भूलें)।

अंत आप इस (काल्पनिक कोड) की तरह खत्म हो जाना चाहिए पर:

class MyLoggingHook { 
    // called from the hook config 
    public function run($params = array()) { 
     require_once(BASEPATH.'database/DB.php'); 
     $db = DB(); // getting hold of a DAO instance 

     // routing information is always useful to have for pageview logs 
     $RTR = load_class('Router', 'core'); 
     $RTR->_set_routing(); 
     // Router also load Uri and Config classes inside so the following two instances could be interesting too: 
     // $RTR->uri 
     // $RTR->config 

     // load some useful library not related to CodeIgniter 
     $user_agent_detector = load_class('UserAgentDetector', 'libraries', ''); 

     // do some logging 
     $db->insert('page_view_log', array('class' => $RTR->fetch_class(), 'method' => $RTR->fetch_method(), /*...*/); 
    } 
} 

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

डेटाबेस एक्सेस के लिए PDO का उपयोग करके, get_config() के साथ डेटाबेस कॉन्फ़िगरेशन लोड करना, आप किसी भी कोडनिर्देशक से संबंधित कक्षाओं को छूए बिना प्राप्त कर सकते हैं।

+1

पर रिपोर्ट करूंगा यह सही जवाब है, धन्यवाद! मुझे डर था कि मुझे इसे कम स्तर पर रोकना होगा, इसकी पुष्टि करने के लिए धन्यवाद! मैं शायद आपकी सलाह का पालन करूंगा और अच्छे उपाय के लिए किसी भी सीआई कक्षाओं का उपयोग करने से बचूंगा। इसके अलावा, आपने मुझे स्रोत में खोदने के लिए एक अच्छा प्रारंभिक बिंदु दिया है - कुछ मैं भी आभारी हूं! –