क्या कैश क्लीयरिंग पर हुक लगाने का कोई तरीका है?


16

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

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

कोई उपाय ?


जो आप पूरा करने की कोशिश कर रहे हैं उसके आधार पर, पेज के नीचे दिए गए चरणों का उत्तर कोड को साफ़ करने के बाद कोड को बंद करने का एक अच्छा समाधान है।
लेस्टर पेबॉडी

जवाबों:


7

Drupal 7.x में नहीं है, लेकिन पर्याप्त लोगों द्वारा अनुरोध किए जाने के बाद Drupal 8.x में इसे एक हुक के रूप में जोड़ा गया था, हुक_श्रेणी । 7.x में अपनी समस्या को हल करने का एक बेहतर तरीका हो सकता है - हालांकि, आप कैश को कैश को सही करने के बाद किसी तरह की कैश वार्मिंग कार्यक्षमता को शुरू करने की कोशिश कर रहे हैं, सही है? यह दृष्टिकोण करने का एक और तरीका यह है कि एलिसिया क्रोन का उपयोग किया जाए जिसमें क्रोन कैसे संचालित होता है लेकिन दो महत्वपूर्ण हैं जो आपके उपयोग के मामले के लिए प्रासंगिक हो सकते हैं:

एलिसिया क्रोन ड्रुपल मानक क्रोन का विस्तार करता है, जिससे प्रत्येक कार्य पर एक अच्छा अनाज नियंत्रण और आपकी साइट पर कस्टम क्रोन नौकरियों को जोड़ने के कई तरीके हैं।

  • प्रत्येक क्रोन कार्य की समय और आवृत्तियों को निर्धारित करें (आप निर्दिष्ट घंटे में हर दिन कुछ काम चला सकते हैं, अन्य केवल मासिक और इसलिए ...)। प्रत्येक कार्य के लिए आप बस कुछ अक्सर उपयोग किए जाने वाले विकल्पों ("दिन में एक बार", "महीने में एक बार" ...) का चयन कर सकते हैं, या सटीक समय निर्धारित करने के लिए एक शक्तिशाली "linux crontab"-समान सिंटैक्स का उपयोग कर सकते हैं। आप साइट कॉन्फ़िगरेशन को गति देने के लिए अपने अक्सर उपयोग किए जाने वाले विकल्पों को भी परिभाषित कर सकते हैं। ...
  • कार्य निष्पादन की प्राथमिकता / क्रम बदलें। ...

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

यह भी लगता है कि आप क्रोन के साथ मुद्दों को चलाने के लिए अक्सर कैश के लिए अग्रणी हो सकता है बहुत बार फिर से बनाया जा रहा है। यदि ऐसा है, तो आप विशिष्ट कैश क्लियरिंग ऑपरेशन को अपने बाकी क्रोन संचालन की तुलना में एक अलग दर पर चलाने के लिए सेट कर सकते हैं, इसलिए उदाहरण के लिए खोज अनुक्रमण हर 5 मिनट में अपडेट होता है, लेकिन पूर्ण कैश स्पष्ट केवल प्रत्येक पर चलता है 6 घंटे, आदि।

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


वैसे यह एक असली बमर है। जल्दी करो D8! असल में, मेरे पास एल्रेड्री है, जैसा कि मैंने आपको बताया, एल्सिया_क्रॉन के साथ एक क्रोन, हर मिनट चल रहा है, जो आपको ज़रूरत है उसे गर्म कर रहा है। लेकिन जैसा कि मेरी साइट के लिए जा रहा है> 10.000 / विज़िट / घंटा, मुझे पूरा यकीन है कि खाली खाली जगह पर sbdy गिर जाएगा ... वैसे भी, मैं अब जानता हूँ कि यह एक D7 सीमा है!
ग्रेगरी कपुस्टिन

12

ऐसा करने का तरीका इसके hook_flush_cachesसाथ संयोजन में उपयोग करना है register_shutdown_function। उदाहरण कोड:

/**
 * Implements hook_flush_caches().
 */
function mymodule_flush_caches() {
   // After caches are cleared we will run mymodule_cache_rebuild()
   register_shutdown_function('mymodule_cache_rebuild');

   // We don't want to add any custom cache-tables, so just return an empty array
   return array();
}

/**
 * Rebuild expensive cache items that need to be rebuilt immediately.
 */
function mymodule_cache_rebuild() {
  // Do the cache rebuild work here
}

उपयोग करने का register_shutdown_functionअर्थ है कि कैश समाप्त होने के बाद हमारा कैश-पुनर्निर्माण कार्य कहा जाएगा । हम hook_flush_cachesएक तरह से गाली दे रहे हैं कि इसका उपयोग करने का कभी इरादा नहीं था, लेकिन यह वही होना चाहिए जो आपको चाहिए।


मुझे वास्तव में यह समाधान पसंद है। इसे स्वयं उपयोग करने से पहले, मैंने register_shutdown_function()Drupal में उपयोग किए गए किसी भी ज्ञात मुद्दे / संघर्ष की खोज की , और Drupal core के drupal_register_shutdown_function () में आया : "register_shutdown_act () के लिए आवरण जो" अज्ञात में स्टैक फ्रेम के बिना अपवाद से बचने के लिए अपवादों को पकड़ता है "" पता है कि यह बनाता है मुझे बारे में बेहतर महसूस abusing hook_flush_cachesकरता है, तो मैं केवल Drupal प्रमुख कार्यों का उपयोग कर रहा यह करने के लिए।
runswithscissors

11

नहीं, वहाँ नहीं है। ज़रुरी नहीं। कम से कम 6 या 7 में नहीं। 7 मान लिया गया:

यदि आप drupal_flush_all_caches()देखेंगे तो आप इसे देखेंगे hook_flush_caches()। इस हुक का मतलब है:

"कैशे टेबल की सूची में कैशे टेबल के नाम जोड़ें, जो परफॉर्मेंस पेज पर क्लियर बटन या जब भी ड्रुपल_फ्लश_ऑल_स्कैच किया जाता है, क्लियर हो जाएगा।"

यह केवल आपके मॉड्यूल के हुक को अंतिम बनाने और कोड लिखने के लिए लुभावना होगा। लेकिन आइए फिर से देखें drupal_flush_all_caches()। वास्तविक विलोपन इस तरह होता है:

  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all('*', $table, TRUE);
  }

इसका मतलब यह है कि कुछ भी साफ होने से पहले सभी हुक निकाल दिए जाते हैं । सिर्फ एक ही समारोह, वास्तविक हटाए जाने के बाद कहा जाता है _system_update_bootstrap_status(), लेकिन यह केवल कॉल hook_boot, hook_exit, hook_watchdogऔर hook_language_init- हुक आप केवल लागू करने के लिए कैश साफ-निर्भर कार्यक्षमता प्रदान नहीं करना चाहती।


दमिति, मुझे इन सभी कड़ियों को जोड़ने में बहुत समय लगा;) इसे अभी के लिए छोड़ दूंगा क्योंकि मैं इसे हटाने के लिए खुद को मजबूर नहीं कर सकता, इतना समझाने के बाद कि यह क्यों नहीं किया जा सकता।
Mołot

3
इसे छोड़ दो, यह एक अच्छा जवाब है।
mpdonadio

हां इसे छोड़ दें, मैं सभी अच्छे उत्तरों की जांच नहीं कर सकता, लेकिन मैंने इसे छोड़ दिया :)
ग्रेगरी कपस्टिन

8

यहाँ व्यापक स्ट्रोक:

जबकि पूर्व-डी 8 में कोई हुक नहीं है, आप मानक के आधार पर अपना खुद का डेटाबेस बैकएंड लिख सकते हैं DrupalDatabaseCacheऔर फिर अपने clear()फ़ंक्शन में किसी भी या सभी प्रकार के तर्क लिख सकते हैं। एक त्वरित नज़र यह डी 7 में एक उचित रूप से सीधा होने का सुझाव देगा (बस कक्षा को अपने कस्टम नाम पर कॉपी करें और इसे module_invoke_all()उपयुक्त रूप में फेंककर आदि को संशोधित करें) और कैश_बैकपोर्ट मॉड्यूल के साथ डी 6 में भी काम करेगा। फिर किसी भी कैश डिब्बे को इंगित करें जिसे आप स्पष्ट रूप से चाहते हैं और आपको अपने रास्ते पर होना चाहिए।


3
यह शायद सबसे अच्छा समाधान है, केवल 'समस्या' यह है कि यदि आपके पास कई कैश डिब्बे (मेम्चे, रेडिस, आदि) हैं तो आपको कई कैश वर्गों का विस्तार करना होगा। फिर भी लायक हालांकि
क्लाइव

मेमेकैड, एपीसी या अन्य गैर-डीबी समाधान में कैश के साथ काम नहीं करेगा, क्या यह होगा?
मोलॉट

मैं Redis का उपयोग करता हूं, निश्चित नहीं कि यह काम करेगा।
ग्रेगरी कपुस्टिन

यदि आप drupal.org/project/redis का उपयोग कर रहे हैं, तो आपको कस्टम मॉड्यूल में आपूर्ति की गई कक्षाओं आदि को बस कॉपी या अन्यथा संशोधित करने में सक्षम होना चाहिए और उसके बाद उनका उपयोग करना चाहिए। यदि, हालांकि, आप कुछ पैन्थियोन प्लेटफॉर्म की तर्ज पर उपयोग कर रहे हैं, जहां वे रेडिस के लिए सभी भारी लिफ्ट प्रदान करते हैं, तो हाँ, आपको इन सभी के बारे में उनके साथ समन्वय करने की आवश्यकता होगी।
जिमजम्मा

3

यदि आप स्रोत के लिए देखें drupal_flush_all_caches()और clear_cache_all(), आप देखेंगे कि कोई हुक पोस्ट क्लीयरिंग नहीं है, जो कि एक सुंदर बग बमर है।

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

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

दूसरी बात यह है कि मेरे पास एक ड्रश स्क्रिप्ट है जो drupal_http_request()मेरे सभी यूआरएल (न सिर्फ महत्वपूर्ण लोगों पर) करती है ताकि सब कुछ कैश हो जाए। यह कैसे किया जाता है यह साइट द्वारा भिन्न होता है। कभी-कभी मैं केवल प्रकाशित नोड्स EFQ कर सकता हूं, और इस तरह से URL बना सकता हूं। दूसरी बार, आप अपना URL प्राप्त करने के लिए XML साइटमैप सारणी को क्वेरी कर सकते हैं। मैं तब अपने सिस्टम क्रोन से इसे जितनी बार आवश्यकता होती हूं कहता हूं।


1

विकल्पों में से कुछ:
https://www.drupal.org/project/cache_graceful वही हो सकता है जो आप चाहते हैं।

https://www.drupal.org/project/apdqc में 2 हुक हैं जो कैश पर आग को साफ करते हैं जिससे आप स्पष्ट को बदल सकते हैं drupal_alter('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);और आपको स्पष्ट प्रतिक्रिया करने की अनुमति देने के बाद module_invoke_all('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);। APDQC को सही तरीके से काम करवाएं और $conf['apdqc_call_hook_on_clear'] = TRUE;अपनी सेटिंग में सेट करें। फाइल को तब और जब भी कैश क्लियर हो जाए, तब हुक को कॉल किया जाना चाहिए।


1

यह हर किसी के लिए उपयुक्त नहीं हो सकता है, और ओपी के लिए जल्दी नहीं हो सकता है - क्योंकि यह केवल अगले पृष्ठ के आरंभ पर शुरू होता है। हालाँकि, इससे मुझे "कैश क्लियर ऑल" के बाद ट्रिगर कोड के साथ मदद मिली, जो समय के प्रति संवेदनशील नहीं था।

जाहिर है HOOKअपने खुद के मॉड्यूल नाम के साथ की जरूरत है।

/**
 * Implements hook_init().
 */
function HOOK_init(){
  // if there is no cache_not_empty defined, define it 
  // and then trigger our cache cleared code
  if ( !cache_get('HOOK_cache_not_empty') ) {
    cache_set('HOOK_cache_not_empty', TRUE);
    foreach (module_implements('cache_cleared') as $module) {
      module_invoke($module, 'cache_cleared');
    }
  }
}

/**
 * Implements hook_cache_cleared().
 */
function HOOK_cache_cleared(){
  // do what you need here, in which ever module.
}

यदि आपके पास एक विशिष्ट बिन है जिसे आपको लक्षित करने की आवश्यकता है, तो उपरोक्त का समर्थन करने के लिए संशोधित किया जा सकता है, जब तक कि पूरे बिन आपके कैश के बिंदु पर खाली हो जाता है।

hook_initकेवल गैर-कैश्ड पृष्ठों के लिए निष्पादित किया जाता है। हालाँकि पूर्ण कैश के स्पष्ट होने का मतलब कोई कैश किए गए पृष्ठ नहीं होने चाहिए, लेकिन इससे कोई समस्या नहीं होनी चाहिए। हालांकि, वार्निश जैसे बाहरी कैशिंग सिस्टम इस ट्रिगर के रास्ते में मिलेंगे, और इसका मतलब यह होगा कि यह केवल तब होगा जब अगला उचित अनुरोध ड्रुपल तक वापस पहुंच जाएगा।

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


0

मुझे इसी तरह की आवश्यकता थी, जहां एक ग्राहक ड्रुपल और वार्निश दोनों कैश को फ्लश करना चाहता था जब उन्होंने "फ्लश ऑल कैश" बटन मारा। मैंने ऐसा करने के लिए उस मेनू आइटम को हाईजैक कर लिया।

यह क्रोन या कहीं और किसी भी कैश क्लियर को हिट नहीं करेगा - सिर्फ मेनू लिंक पर।

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  if (isset($items['admin_menu/flush-cache'])) {
    $items['admin_menu/flush-cache']['page callback'] =
      "_mymodule_custom_flush_cache";
  }
}

/**
 * Hijacks the "flush all caches" button in menu
 */
function _mymodule_custom_flush_cache() {
  /**
   * Clear varnish, or other logic here
   */
  admin_menu_flush_cache(); //Run the normal cache clearing stuff
}

Thx ट्रैविस, लेकिन मैं एक ऐसे रास्ते की तलाश में हूं जो किसी भी स्पष्ट कैशिंग पर हुक करता है, न केवल एक उपयोगकर्ता द्वारा स्वेच्छा से ट्रिगर किया गया।
ग्रेगरी कपुस्टिन

0

आप https://www.drupal.org/project/recacher पर प्रयास करना पसंद कर सकते हैं - यह समय सीमा समाप्त पृष्ठों का पता लगाने के लिए कैशे समाप्ति मॉड्यूल का उपयोग करता है और फिर उन पृष्ठों को उत्कृष्ट HTTPRL का उपयोग करके फिर से कैश करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.