कैश संदर्भ (Cache Contexts)
कैश संदर्भ = (रिक्वेस्ट) कॉन्टेक्स्ट डिपेंडेंसीज़
कैश संदर्भ HTTP हेडर Vary के समान हैं।
क्यों?
कैश संदर्भ यह परिभाषित करते हैं कि किसी ऐसी चीज़ के कॉन्टेक्स्ट पर आधारित वेरिएंट कैसे बनाए जाएँ जिसे कैश करना है। इससे वह कोड, जो कैश बनाता है, पढ़ने में आसान हो जाता है और एक ही लॉजिक को हर उस जगह दोहराने की ज़रूरत नहीं होती जहाँ वही कॉन्टेक्स्टुअल बदलाव चाहिए।
उदाहरण:
- कुछ डेटा का आउटपुट सक्रिय थीम पर निर्भर करता है और अलग-अलग थीम के लिए अलग परिणाम दिखाता है। तब आप थीम कैश संदर्भ पर निर्भर कैश का इस्तेमाल करेंगे।
- जब आप ऐसा रेंडर ऐरे बनाते हैं जो पर्सनलाइज़्ड संदेश दिखाता है, तब रेंडर ऐरे उपयोगकर्ता पर निर्भर करता है। तब कैश उपयोगकर्ता कैश संदर्भ पर निर्भर करेगा।
- आम तौर पर: जब कुछ जानकारी, जिसे निकालना महँगा है, सर्वर वातावरण पर निर्भर करती है, तब इसके लिए भी कैश संदर्भ का उपयोग होता है।
कैसे?
कैश संदर्भ एक स्ट्रिंग होता है, जो उपलब्ध कैश संदर्भ सेवाओं (नीचे देखें) में से किसी एक को संदर्भित करता है।
कैश संदर्भ सेट के रूप में पास किए जाते हैं (क्रम मायने नहीं रखता), इसलिए वे string[] में होते हैं। यह सेट होते हैं क्योंकि एक कैश आइटम कई कैश संदर्भों पर निर्भर हो सकता है।
आमतौर पर कैश संदर्भ रिक्वेस्ट कॉन्टेक्स्ट (यानी रिक्वेस्ट) से आते हैं। वेब-एप्लिकेशन का अधिकांश वातावरण रिक्वेस्ट कॉन्टेक्स्ट से प्राप्त होता है। आखिरकार, HTTP प्रतिक्रियाएँ (responses) काफी हद तक उन HTTP अनुरोधों के गुणों पर आधारित होती हैं जिन्होंने उन्हें ट्रिगर किया।
लेकिन इसका मतलब यह नहीं है कि कैश संदर्भ हमेशा रिक्वेस्ट से ही आएँ — वे डिप्लॉय किए गए कोड पर भी निर्भर कर सकते हैं, जैसे deployment_id कॉन्टेक्स्ट।
दूसरा, कैश संदर्भों को हाइरार्की के रूप में वर्णित किया जाता है। सबसे आसान उदाहरण: जब कुछ हर उपयोगकर्ता के लिए अलग है, तो हमें केवल परमिशन पर निर्भर करने की ज़रूरत नहीं है, क्योंकि यह पहले से ही प्रत्येक उपयोगकर्ता के लिए अलग है। परमिशन सेट के लिए, कैशिंग प्रत्येक परमिशन के लिए होती है। यदि पेज का एक हिस्सा प्रत्येक उपयोगकर्ता के लिए अलग है और दूसरा हिस्सा परमिशन के लिए अलग है, तो Drupal इतना स्मार्ट होना चाहिए कि केवल प्रति-यूज़र फर्क का इस्तेमाल करे। यही वह जगह है जहाँ Drupal हाइरार्की की जानकारी का इस्तेमाल करके अनावश्यक कैश वेरिएशन बनने से बचाता है।
सिंटैक्स
- डॉट्स पैरेंट्स और चाइल्ड्स को अलग करते हैं
- बहुवचन कैश नाम इंगित करता है कि पैरामीटर का उपयोग किया जा सकता है: कॉलन जोड़ें और वांछित पैरामीटर निर्दिष्ट करें (यदि कोई पैरामीटर निर्दिष्ट नहीं है, तो सभी संभावित पैरामीटर इकट्ठे होंगे, जैसे कि सभी क्वेरी आर्ग्यूमेंट्स)
Drupal 8 कोर कैश संदर्भ
Drupal 8 कोर निम्नलिखित कैश संदर्भ हाइरार्की के साथ आता है:
cookies
:name
headers
:name
ip
languages
:type
protocol_version // Drupal 8.9.x या उच्चतर में उपलब्ध
request_format
route
.book_navigation
.menu_active_trails
:menu_name
.name
session
.exists
theme
timezone
url
.path
.is_front // Drupal 8.3.x या उच्चतर में उपलब्ध
.parent
.query_args
:key
.pagers
:pager_id
.site
user
.is_super_user
.node_grants
:operation
.permissions
.roles
:role
नोट: url.path.is_front कैश संदर्भ का उपयोग पुराने रिलीज़ में करने के लिए, यह बदलाव नोट देखें।
जहाँ भी कैश संदर्भों का उपयोग होता है, पूरी यह हाइरार्की निर्दिष्ट की जाती है, जिसके तीन लाभ हैं:
- कोई अस्पष्टता नहीं: यह स्पष्ट है कि पैरेंट कैश संदर्भ किस पर आधारित है
- तुलना और ऑप्टिमाइज़ेशन आसान हो जाता है: अगर a.b.c और a.b दोनों मौजूद हैं, तो a.b पहले से ही a.b.c को कवर करता है
- हर लेवल को पूरे ट्री में यूनिक बनाने की ज़रूरत नहीं
कैसे पहचानें, परिभाषित करें और बनाएं?
कैश संदर्भ टैग किए गए सेवाएँ (services) हैं cache.context के साथ। इस तरह, कोई भी मॉड्यूल कैश संदर्भ जोड़ सकता है। वे \Drupal\Core\Cache\Context\CacheContextInterface या \Drupal\Core\Cache\Context\CalculatedCacheContextInterface (पैरामीटर वाले संदर्भों के लिए) को लागू करते हैं।
इसलिए, सभी उपलब्ध कैश संदर्भ देखने के लिए, बस इन इंटरफेस की सभी implementations ढूंढें या Drupal Console का उपयोग करें:
$ drupal debug:cache:context
Context ID Label Class path
cookies HTTP-Cookies Drupal\Core\Cache\Context\CookiesCacheContext
headers HTTP-Header Drupal\Core\Cache\Context\HeadersCacheContext
ip IP-Address Drupal\Core\Cache\Context\IpCacheContext
languages Language Drupal\Core\Cache\Context\LanguagesCacheContext
request_format Request format Drupal\Core\Cache\Context\RequestFormatCacheContext
route Route Drupal\Core\Cache\Context\RouteCacheContext
route.book_navigation Book navigation Drupal\book\Cache\BookNavigationCacheContext
route.menu_active_trails Active menu trails Drupal\Core\Cache\Context\MenuActiveTrailsCacheContext
किसी भी क्लास में आपको ऐसा कमेंट दिखेगा:
Cache context ID: 'user'.
इसका मतलब है कि 'user' वह वास्तविक कैश संदर्भ है जिसे आप कोड में उपयोग कर सकते हैं।
डिबगिंग
Drupal यह भी बताता है कि किसी रेस्पॉन्स का कैश किन संदर्भों पर निर्भर करता है: इसके लिए बस X-Drupal-Cache-Contexts हेडर देखें।
डायनामिक पेज कैश
Drupal 8 में कैश संदर्भों का व्यापक उपयोग डिफ़ॉल्ट रूप से Dynamic Page Cache सक्षम करने की अनुमति देता है।
इंटरनल पेज कैश
Internal Page Cache मानता है कि सभी पेज अज्ञात (anonymous) उपयोगकर्ताओं के लिए समान हैं। यदि आप अज्ञात उपयोगकर्ताओं के लिए कैश संदर्भ के आधार पर कंटेंट बदलना चाहते हैं, तो आपको इस मॉड्यूल को बंद करना होगा।