Կեշի կոնտեքստներ
Կեշի կոնտեքստների կեշավորումը = (հարցում) կոնտեքստային կախվածություններ
Կեշի կոնտեքստները նման են HTTP վերնագրի Vary-ի։
Ինչու՞:
Կեշի կոնտեքստները սահմանում են, թե ինչպես ստեղծել կոնտեքստից կախված տարբերակներ այն բանի, ինչը անհրաժեշտ է կեշավորել։ Կոդը, որը ստեղծում է կեշերը, դառնում է ավելի ընթերցանելի, և նույն տրամաբանությունը անհրաժեշտ չէ կրկնել յուրաքանչյուր վայրում, որտեղ պետք են նույն կոնտեքստային փոփոխությունները։
Օրինակներ.
- Որոշ տվյալների արտածումը կախված է ակտիվ թեմայից, և տարբեր արդյունքներ են ցուցադրվում տարբեր թեմաների համար։ Այդ դեպքում կեշը կլինի թեմայի կեշ կոնտեքստից կախված։
- Ռենդերինգի զանգված ստեղծելիս, որը ցույց է տալիս անհատականացված հաղորդագրություն, ռենդերինգի զանգվածը կախված է օգտատիրոջից։ Այդ դեպքում կեշը կլինի օգտատիրոջ կեշ կոնտեքստից կախված։
- Ընդհանրապես՝ երբ թանկարժեք հաշվարկվող տվյալները կախված են սերվերի միջավայրից, դրա համար նույնպես օգտագործվում է կեշի կոնտեքստ։
Ինչպես՝
Կեշի կոնտեքստը տող է, որը հղում է կեշի կոնտեքստի ծառայություններից մեկին (տես ստորև)։
Կեշի կոնտեքստները փոխանցվում են տողի հավաքածուներով (պорядокը նշանակություն չունի), այդ պատճառով դրանք արտահայտվում են string[] տեսքով։ Այդ հավաքածուները անհրաժեշտ են, քանի որ մեկ կեշի տարրը կարող է կախված լինել մի քանի կեշ կոնտեքստներից։
Հիմնականում կեշի կոնտեքստները ստացվում են հարցման կոնտեքստի օբյեկտից (այսինքն՝ HTTP հարցումից)։ Վեբ ծրագրի մեծ մասն ստացվում է հարցման կոնտեքստից։ HTTP պատասխանը մեծապես կախված է այդ HTTP հարցման հատկություններից, որոնք հրահրել են պատասխանը։
Բայց դա չի նշանակում, որ կեշի կոնտեքստները պարտադիր պետք է սկսվեն հարցումից՝ դրանք կարող են կախված լինել նաև տեղադրման (deployment) կոնտեքստից։
Երկրորդ՝ կեշի կոնտեքստները նկարագրված են որպես հիերարխիա։ Ամբողջական օրինակ․ երբ ինչ-որ բան տարբերվում է յուրաքանչյուր օգտատիրոջ համար, այլ ոչ թե պարզապես թույլտվությունները, քանի որ տարբերությունները յուրաքանչուր օգտատիրոջ համար են։ Ուստի թույլտվությունների հավաքածուն կեշավորվում է յուրաքնչյուր իրավունքների համար։ Եթե էջի մի մասը տարբերվում է յուրաքանչյուր օգտատիրոջ համար, իսկ մյուսը՝ թույլտվությունների համար, Drupal-ը պետք է բավականաչափ խելացի լինի՝ օգտագործելու փոփոխությունները միայն օգտատիրոջ համար։ Սա հենց այն վայրն է, որտեղ Drupal-ը կարող է օգտվել հիերարխիկ տեղեկատվությունից՝ ավելորդ կեշերի առաջացումից խուսափելու համար։
Սինտաքսիս
- Կետերը բաժանում են ծնողական տարրերը զավակներից։
- Կեշի անունը բովանդակվում է բազմությամբ, ինչը ցույց է տալիս, որ կարող է օգտագործվել պարամետր․ ավելացրեք երկկետ և նշեք ցանկալի պարամետրը (եթե պարամետրը նշված չէ, հավաքվում են բոլոր հնարավոր պարամետրերը, օրինակ՝ բոլոր հարցման արգումենտները)։
Drupal 8-ի հիմնական կեշ կոնտեքստների հիերարխիան
Drupal 8-ի հիմնական կեշը տրամադրում է հետևյալ կեշ կոնտեքստների հիերարխիան.
cookies :name headers :name ip languages :type protocol_version // հասանելի է 8.9.x և ավելի նորում request_format route .book_navigation .menu_active_trails :menu_name .name session .exists theme timezone url .path .is_front // հասանելի է 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 կեշ կոնտեքստը նախորդ շախմատներում/հրապարակումներում, տեսեք փոփոխության գրառումը։
Որտեղ օգտագործվում են կեշի կոնտեքստները, նշվում է ամբողջ հիերարխիան, որը ապահովում է 3 առավելություն․
- ոչ միամիտություն՝ հստակ է, թե ո՞ր կոնտեքստի վրա է հիմնված ծնողական կոնտեքստը, որտեղ էլ որ օգտագործվի։
- կեշի կոնտեքստների համեմատությունը (և կրճատումը) դառնում է պարզ․ եթե միաժամանակ առկա են a.b.c և a.b, ապա հստակ է, որ a.b ներառում է a.b.c, հետևաբար կարելի է հանել a.b.c-ը և օգտագործել միայն ծնողականը։
- ոչ պետք է հոգալ, որ ծառի յուրաքանչյուր մակարդակը եզակի լինի ամբողջ ծառի մեջ։
Օրինակներ կեշի կոնտեքստների այս հիերարխիայից՝
- theme (կախված է տեղադրված թեմայից)
- user.roles (կախված է դերերի համակցությունից)
- user.roles:anonymous (կախված է արդյոք ընթացիկ օգտատերը ունի «անանուն» դեր կամ ոչ՝ նշանակում է «համարելով անանուն օգտատեր»)
- languages (կախված է բոլոր լեզվի տեսակներից՝ ինտերֆեյս, բովանդակություն և այլն)
- languages:language_interface (կախված է ինտերֆեյսի լեզվից - LanguageInterface::TYPE_INTERFACE)
- languages:language_content (կախված է բովանդակության լեզվից - LanguageInterface::TYPE_CONTENT)
- URL (կախված է ամբողջ URL-ից)
- url.query_args (կախված է ողջ հարցման տողից)
- url.query_args:foo (կախված է հարցման արգումենտ foo-ից)
- protocol_version (կախված է HTTP 1 և 2 տարբերությունից)
Կեշի կոնտեքստների օպտիմալացում/կրճատում/Միաձուլում/պարզեցում
Drupal-ը ավտոմատ օգտագործում է հիերարխիկ տեղեկատվությունը՝ կեշի կոնտեքստները առավելագույնը պարզեցնելու համար։ Օրինակ՝ երբ էջի մի մասը փոխվում է օգտատիրոջ համար (կեշ կոնտեքստ user), իսկ մյուսը՝ թույլտվությունների համար (կեշ կոնտեքստ user.permissions), ապա վերջնական արդյունքը փոխելն իմաստ չունի՝ քանի որ փոփոխությունները կան յուրաքանչյուր օգտատիրոջ համար։
Մյուս խոսքով՝ optimize([user, user.permissions]) = [user]։
Նույնիսկ եթե օգտատերը ենթադրյալն է user.permissions-ը, քանի որ դա ավելի կոնկրետ է, եթե մենք օպտիմալացնենք user.permissions-ը, թույլտվությունների փոփոխությունները այլևս չեն բերի, որ user.permissions-ի կեշ կոնտեքստը բեռնվի յուրաքնչյուր էջի համար։ Դա նշանակում է, որ եթե թույլտվությունները փոխվեն, մենք շարունակելու ենք օգտագործել նույն կեշավորված տարբերակը, նույնիսկ եթե այն պետք է փոխվեր թույլտվությունների ցանկացած փոփոխությամբ։
Ահա թե ինչու կեշի կոնտեքստները, որոնք կախված են ժամանակի ընթացքում փոփոխվող կոնֆիգուրացիայից, կարող են կապել կեշավորման մետատվյալները՝ կեշի տեգեր և max-age (առավելագույն տարիքը)։ Երբ նման կեշ կոնտեքստ օպտիմալացվում է, դրա կեշի տեգերը կապվում են կեշի տարրի հետ։ Հետևաբար՝ երբ նշանակված թույլտվությունները փոխվում են, կեշի տարրը նույնպես կդառնա անվավեր։
(Հիշեք, որ «կեշավորում» էականում նշանակում է «չանհրաժեշտ հաշվարկներից խուսափել»։ Կոնտեքստի օպտիմալացումը կարելի է դիտարկել որպես getContext() մեթոդի արդյունքի կեշավորում կոնտեքստ ծառայության համար։ Սա անուղղակի կեշ է (արժեքը նետվում է՝ պահպանելու փոխարեն), բայց արդյունքը նույնն է․ կեշը հարվածելու դեպքում getContext() չի կանչվում, հետևաբար՝ հաշվարկներից խուսափում են։ Եվ երբ մենք ինչ-որ բան կեշավորում ենք, մենք կապում ենք դրա կեշավորվելիությունը՝ կեշի տեգերը և max-age-ը)։
Այնպիսի մի համեմատաբար բարդ օրինակ է՝ node grants-ը։ Node grants-ը կիրառվում է կոնկրետ օգտատիրոջ համար, հետևաբար node permissions կեշի կոնտեքստը ունի user.node_grants տեսք։ Բայց node permissions-ը շատ դինամիկ է (օրինակ՝ կարող է կախված լինել ժամանակից և փոփոխվել ամեն քանի րոպեն մեկ)։ Դա կախված է կայքի ներկայացրած node grant hook-երի իրականացումներից։ Արդյունքում, ավելի լավ է օգտագործել node grants կեշ կոնտեքստ՝ max-age = 0 (չկեշավորվող)։ Հետևաբար՝ optimize([user, user.node_grants]) = [user, user.node_grants]։
Որոշ կայքեր կարող են վերաշարադրել node permissions կեշ կոնտեքստի ստանդարտ իրականացումը՝ max-age = 3600 նշանակելով՝ ասելով, որ իրենց բոլոր node grant հուկերը թույլ են տալիս կեշավորել մուտքի արդյունքները մինչև մեկ ժամ։ Այդ կայքերում optimize([user, user.node_grants]) = [user]։
Ինչպե՞ս ճանաչել, սահմանել և ստեղծել:
Կեշի կոնտեքստները ծառայություններ են, որոնք պիտակավորված են cache.context։ Դրա շնորհիվ ցանկացած մոդուլ կարող է ավելացնել կեշի կոնտեքստներ։ Դրանք իրականացնում են \Drupal\Core\Cache\Context\CacheContextInterface կամ \Drupal\Core\Cache\Context\CalculatedCacheContextInterface (կոնտեքստների համար, որոնք ընդունում են պարամետրեր, օրինակ՝ :parameter սուդֆիքս ունեցող կոնտեքստներ)։
Այդ պատճառով, որպեսզի գտնեք օգտագործման համար հասանելի բոլոր կեշի կոնտեքստները, պարզապես գտեք CacheContextInterface և CalculatedCacheContextInterface ինտերֆեյսների բոլոր իրականացումները։ (PHPStorm-ում՝ Տիպերի հիերարխիա → Դուստր տիպերի հիերարխիա, NetBeans-ում՝ աջ կոճակով սեղմեք ինտերֆեյսի անունը → Գտնել օգտագործումը → Գտնել բոլոր ենթատիպերը։)
Այլընտրանքային տարբերակ է Drupal կոնսոլը օգտագործելը՝ drupal debug:cache:context հրամանը, որը ցուցադրում է բոլոր ընթացիկ կեշի կոնտեքստները ձեր կայքի կամ հավելվածի համար՝
$ 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-Adresse Drupal\Core\Cache\Context\IpCacheContext languages Language Drupal\Core\Cache\Context\LanguagesCacheContext request_format Anfrageformat Drupal\Core\Cache\Context\RequestFormatCacheContext route Route Drupal\Core\Cache\Context\RouteCacheContext route.book_navigation Buchnavigation Drupal\book\Cache\BookNavigationCacheContext route.menu_active_trails Aktiver Menüpfad Drupal\Core\Cache\Context\MenuActiveTrailsCacheContext
Յուրաքանչյուր այդ դասում կտեսնեք նմանատիպ մեկնաբանություն՝ \Drupal\Core\Cache\Context\UserCacheContext-ի մեջ՝
Cache context ID: 'user'.
Սա նշանակում է, որ 'user' իրական կեշ կոնտեքստն է, որը կարող եք նշել ձեր կոդում։ (Այլընտրանքային մոտեցում՝ գտնեք, թե որտեղ է այս դասը օգտագործվում *.services.yml ֆայլում և դիտեք ծառայության ID-ն։ Տես ստորև։)
Նշում․ Կեսի կոնտեքստների ամբողջական և արդի ցուցակը կարող եք ստանալ միայն դիտելով cache_context պիտակով նշված ծառայությունները Drupal-ի աղբյուրում։
Ծառայության ID-ն ստանդարտացված է։ Դա միշտ սկսվում է cache_context. նախապատմամբ, այնուհետև գալիս են ծնողական կոնտեքստները և վերջապես՝ կոնտեքստի անունը։ Օրինակ՝ cache_context.route.book_navigation՝
cache_context.route.book_navigation: class: Drupal\book\Cache\BookNavigationCacheContext arguments: ['@request_stack'] tags: - { name: cache.context }
Սա սահմանում է route.book_navigation կեշ կոնտեքստը։
Վերլուծություն (debugging)
Բոլոր վերոնշյալը օգտակար է որևէ կեշավորված բան վերլուծելիս։ Բայց կա ևս մեկ բան․ ասենք, որ ինչ-որ բան կեշավորվում է ['foo', 'bar'] կեշ տեգերով և ['languages:language_interface', 'user.permissions', 'route'] կեշ կոնտեքստներով։ Հետեւաբար համապատասխան կեշ տարրը կկեշավորվի հատուկ կեշ կոնտեյների մեջ՝ CID (կեշի նույնացուցիչ) տեսքով․
foo:bar:[languages:language_interface]=en:[user.permissions]=A_QUITE_LONG_HASH:[route]=myroute.ROUTE_PARAMS_HASH
Այլ խոսքով՝
- կեշ տեգերը նշվում են առաջին հերթին՝ նշված կարգով
- կեշ կոնտեքստները նշվում են երկրորդ՝ այբբենական կարգով և ձևավորում են CID-ի մասեր՝ [<cache context name>]=<cache context value>
- այս բոլոր մասերը միաձուլվում են երկկետով
Սա պետք է հեշտացնի կեշերի վերլուծությունը և վերլուծությունը։
Վերնագրեր (վերլուծություն)
Եվ վերջում՝ հեշտ է տեսնել, թե ինչ կեշ կոնտեքստներից է կախված պատասխանը (և, հետևաբար, ինչով է տարբերվում)՝ պարզապես նայելով X-Drupal-Cache-Contexts վերնագրին։
Նշում․ եթե չեք տեսնում այդ վերնագրերը, անհրաժեշտ է կարգավորել Drupal-ի միջավայրը՝ մշակում համար։
Դինամիկ էջի կեշավորում
Կեշ կոնտեքստների համապարփակ օգտագործման շնորհիվ Drupal 8-ը տրամադրում է դինամիկ էջի կեշավորում՝ որը նախորդում էր «Smart Cache» անվանումով։
Ներքին էջի կեշավորում
Նշեք, որ ներքին էջի կեշավորումը ենթադրում է, որ բոլոր էջերը, որոնք սպասարկվում են անանուն օգտատերերին, նույնն են՝ անկախ կեշի կոնտեքստների իրականացումից։ Եթե ցանկանում եք օգտագործել կեշի կոնտեքստները անանուն օգտատերերին մատուցվող բովանդակության փոփոխման համար, այդ մոդուլը պետք է անջատվի, ինչը կարող է ազդել արագության վրա։
Տես նաև
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.