कर्नेलएवेंट्स :: कैश किए गए पृष्ठों पर अनुरोध को निकाल नहीं दिया गया है


13

मैं एक कर्नेलईवेन्ट्स को लागू करने का प्रयास कर रहा हूं :: पृष्ठ लोड पर कुछ कार्रवाई करने के लिए घटना का ग्राहक।

मुझे इस घटना की आग की परवाह किए बिना कि क्या अनुरोधित पृष्ठ ड्रुपल कैश में मौजूद है - ऐसा लगता है कि कर्नेलएवेंट्स :: अनुरोध तब नहीं होता जब ड्रुपल कैश से कुछ काम करता है।

क्या कोई ऐसी घटना है जिसे मैं इसे प्राप्त करने के लिए उपयोग कर सकता हूं, या क्या मुझे मिडलवेयर के कुछ रूपों के रूप में अपनी आवश्यकताओं को लागू करना चाहिए?


1
अनुरोध घटना को ट्रिगर किया जाना चाहिए, अन्यथा कोई प्रतिक्रिया नहीं होगी। IMHO आपके ES का वजन कम है और http_middleware.page_cache (या डायनेमिक पेज कैश) सेवा इस घटना के प्रसार को रोक रही है, इसलिए आपका ES ट्रिगर नहीं होगा।

ES वजन / प्राथमिकता 20 पर सेट है

जैसा कि 4k4 ने लिखा, अनाम उपयोगकर्ताओं के लिए page_cache एक मिडलवेयर है और REQUEST घटना से बहुत पहले होता है। आप अपना खुद का मिडलवेयर लिख सकते हैं, जो पहले आता है, लेकिन आप अपने एपेरोच पर पुनर्विचार करना चाहते हैं। क्या वास्तव में इतनी जल्दी होने की जरूरत है? ध्यान रखें कि अनाम पृष्ठ कैशिंग भी अन्य बाहरी सॉफ़्टवेयर या यहां तक ​​कि ब्राउज़र को स्वयं को वार्निश करने में हो सकता है। एक नज़र रखें कि कोर सांख्यिकी मॉड्यूल पृष्ठ विज़िट को कैसे ट्रैक करता है: जावास्क्रिप्ट के साथ जब उपयोगकर्ता इसे निष्पादित करता है तो सर्वर को पिंग करता है।
बर्दिर

@ बर्डिर यह शील्ड मॉड्यूल के समान साइट के लिए http प्रमाणीकरण प्रदान करने के लिए है - इसलिए मुझे लगता है कि यह किसी ऐसी चीज़ का एक वैध उदाहरण प्रस्तुत करता है जिसे अनुरोध में जल्द से जल्द संभाला जाना चाहिए। (मुझे पता है कि डी 8 शील्ड मॉड्यूल पैच को मिडलवेयर के रूप में लागू किया गया है - मैं इस सीमा के कारण मान रहा हूं)।

जवाबों:


14

डायनेमिक कैश प्राथमिकता 27 के साथ किसी ईवेंट को सब्सक्राइब करता है। यदि आप चाहते हैं कि आपका कोड इससे पहले चले तो आपको प्राथमिकता> 27 का उपयोग करना होगा:

  public static function getSubscribedEvents() {
    $events = [];

    // Run after AuthenticationSubscriber (necessary for the 'user' cache
    // context; priority 300) and MaintenanceModeSubscriber (Dynamic Page Cache
    // should not be polluted by maintenance mode-specific behavior; priority
    // 30), but before ContentControllerSubscriber (updates _controller, but
    // that is a no-op when Dynamic Page Cache runs; priority 25).
    $events[KernelEvents::REQUEST][] = ['onRequest', 27];

जो डायनेमिकपेजचेकस्क्रिप्सर चलाता है :: onRequest ।।


प्राथमिकता 20 पर सेट है

मुझे लगता है कि आपके पास गतिशील कैश से घटना के साथ समस्या है, मैंने अपना उत्तर संपादित किया।
4k4

धन्यवाद @ 4k4, लेकिन प्राथमिकता के साथ 30 पर सेट होने के बाद भी यह एक ही व्यवहार करता है (मैंने मॉड्यूल को फिर से स्थापित किया और परिवर्तन करने के बाद सभी कैश को साफ कर दिया)। कोई अन्य विचार?

दो कैश हैं। अब जब आपके पास डायनेमिक कैश पर प्राथमिकता है, तब भी पेज कैश है। पृष्ठ कैश मुख्य कर्नेल से पहले निष्पादित किया जाता है। आप इस मॉड्यूल को अनइंस्टॉल कर सकते हैं और परीक्षण कर सकते हैं यदि प्रदर्शन इसके बिना ठीक है।
4k4

मैं पुष्टि कर सकता हूं कि यह मेरे लिए काम कर रहा है। मेरे पास एक रीडायरेक्ट था जो केवल एक बार ही होगा - पृष्ठ कैश होने से पहले। जब मैंने प्राथमिकता जोड़ी ['checkForRediret', 30];तो यह उम्मीद के मुताबिक काम किया।
साइक्लोनोस्कोप

6

Drupal 8 में दो स्तर कैश, पेज कैश और डायनेमिक पेज कैश हैं।

हां आप डायनामिक पेज कैश को बता सकते हैं जैसे @ 4k4 का उल्लेख किया गया है। आपके द्वारा जारी की जा रही समस्या पेज कैश को इंटरसेप्ट करने की अधिक संभावना है। कुंजी यहाँ है

इसके लिए कुछ उपाय हैं:

  1. नया वर्ग जोड़ें जो 'HttpKernelInterface' को लागू करता है और 200 से अधिक प्राथमिकता के साथ 'http_middleware' पंजीकृत करता है (280 करेगा)। संदर्भों के लिए 'PageCache' क्लास और कार्यान्वयन देखें।

  2. मौजूदा 'PageCache' को 'ServiceProviderBase' से बढ़ाकर नया वर्ग बनाने के लिए। संदर्भ के लिए इस की जाँच करें यहाँ । फिर, 'PageCache' का विस्तार करने के लिए नई कक्षा बनाएँ।

यहाँ कोड संदर्भ है:

यह StaticCacheServiceProvider.php है:

/**
 * Modifies the language manager service.
 */
class StaticCacheServiceProvider extends ServiceProviderBase
{
  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container)
  {
    // Overrides language_manager class to test domain language negotiation.
    $definition = $container->getDefinition('http_middleware.page_cache');
    $definition->setClass('Drupal\your_module\StackMiddleware\StaticCache');
  }
}

यह StaticCache.php है:

/**
 * Executes the page caching before the main kernel takes over the request.
 */
class StaticCache extends PageCache
{
  /**
   * {@inheritdoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
  {
    // do special logic here.

    $response = parent::handle($request, $type, $catch);

    return $response;
  }
}

आशा मदद करती है।


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