logo

Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll

Ապրանքանիշների պահոց

19/06/2025, by Ivan
Cache tags = տվյալների կախվածություններ
Cache tags նկարագրում են Drupal-ով կառավարվող տվյալներից կախվածությունները

Ինչու՞:

Կեշավորված տեգերը տրամադրում են հայտարարական եղանակ հետևելու, թե որ կեշի տարրերը կախված են Drupal-ով կառավարվող որոշ տվյալներից:

Սա կարևոր է բովանդակության կառավարման համակարգերի/ֆրեյմվորքների համար, ինչպիսին է Drupal-ը, որովհետև նույն բովանդակությունը կարող է բազմակի կերպ օգտագործվել: Այլ կերպ ասած՝ հնարավոր չէ նախապես իմանալ, թե որտեղ և ինչպես է օգտագործվելու տվյալ բովանդակությունը։ Բովանդակության օգտագործման ցանկացած տեղ կարող է կեշավորվել։ Սա նշանակում է, որ նույն բովանդակությունը կարող է կեշավորվել բազմաթիվ վայրերում։ Սա մեզ հանգեցնում է հայտնի մի արտահայտության. Ինֆորմատիկայում գոյություն ունեն միայն երկու լուրջ խնդիր՝ կեշի անվավերացում և անունների շնորհում. այսինքն՝ ինչպես աննալիզացնել բոլոր կեշի տարրերը, որտեղ օգտագործվում է բովանդակությունը:

Նշում. Drupal 7-ն առաջարկում է կեշի տարրերի անվավերացման 3 տարբերակ՝ մեկ կոնկրետ CID-ի անվավերացում, CID-ների նախածանցով անվավերացում կամ ամբողջ կեշի բինի անվավերացում: Դրանքից ոչ մեկը թույլ չի տալիս անվավերացնել այն կեշի տարրերը, որոնք պարունակում են փոփոխված էկզեմպլյար, քանի որ դա հնարավոր չէր իմանալ:

Ո՞րն է:

Կեշի թեգը տող է:

Կեշավորված թեգերը փոխանցվում են տողերի հավաքածուներով (հավաքածուների հերթականությունը կարևոր չէ), ուստի դրանք տպվում են որպես string[]. Հավաքածուներ, որովհետև մեկ կեշի տարրը կարող է կախված լինել բազմաթիվ թեգերից:

Սինթաքսիս

Համաձայնության համաձայն, դրանք ունեն thing:identifier ձևաչափը, և երբ չկա բազմաթիվ էկզեմպլյարների հասկացություն, ունեն ձևաչափ thing: Միակ կանոնը՝ չեն կարող ունենալ բացատներ:

Սկզբունքորեն պարտադիր սինթաքս չի կան:

Օրինակներ՝

  • node:5 - կեշի թեգ Node հանգույցի համար 5 (անվավերանում է երբևիցե այն փոխվի)
  • user:3 - կեշի թեգ User 3 օբյեկտի համար (անվավերանում է երբ փոխվի)
  • node_list - կեշի թեգերի ցանկ Node օբյեկտների համար (անվավերանում է երբ որևէ Node օբյեկտ թարմացվի, ջնջվի կամ ստեղծվի, այսինքն՝ երբ կարող է անհրաժեշտ լինել փոփոխել հանգույցների ցանկը): կիրառելի է ցանկացած էկզեմպլյարի տեսակին հետևյալ ձևաչափով՝ {entity_type}_list.
  • config:system.performance - կեշի թեգ system.performance կոնֆիգուրացիայի համար
  • library_info - կեշի թեգ ակտիվ գրադարանների համար

Հիմնական կեշի թեգեր

Drupal-ով կառավարվող տվյալները բաժանվում են 3 կատեգորիաների՝

  • էկզեմպլյարներ (entities) - ունեն կեշի թեգեր այս տեսքով <entity type ID>:<entity ID>, ինչպես նաև <entity type ID>_list և <entity type ID>_list:<bundle>՝ էկզեմպլյարների ցանկերի անվավերացման համար: Կոնֆիգուրացիոն օբյեկտները օգտագործում են կոնֆիգի հիմնական օբյեկտի կեշի թեգը:
  • կոնֆիգուրացիա - ունեն կեշի թեգեր config:<configuration name> ձևաչափով
  • հատուկ "custom" (օրինակ՝ library_info)

Drupal-ը ինքնաբերաբար տրամադրում է կեշի թեգեր էկզեմպլյարների և կոնֆիգուրացիայի համար - տես Entity բազային դասը և ConfigBase բազային դասը (բոլոր կոնկրետ էկզեմպլյարների և կոնֆիգուրացիայի օբյեկտների տեսակները ժառանգվում են դրանցից):

Չնայած շատ օբյեկտների տեսակներ հետևում են կանխատեսելի կեշի թեգերի ձևաչափին <entity type ID>:<entity ID>, երրորդ կողմի կոդը չպետք է դրան վստահի: Փոխարենը, պետք է ստանա կեշի թեգերը անվավերացնելու համար տվյալ օբյեկտի համար, օգտագործելով մեթոդը : :getCacheTags(), օրինակ՝ $node->getCacheTags(), $user->getCacheTags(), $view->getCacheTags() և այլն:

Բացի այդ, կարող է պահանջվել անվավերացնել նաև կեշերը, որոնք հիմնված են ցանկերի վրա, որոնք կախված են տվյալ էկզեմպլյարից (օրինակ՝ թարմացնել ռենդերացված HTML-ը ցանկի համար, երբ նոր էկզեմպլյար է ստեղծվում): դա կարելի է անել EntityTypeInterface::getListCacheTags() մեթոդով, ապա անվավերացնել այդ մեթոդից վերադարձված բոլոր թեգերը՝ միասին օբյեկտի սեփական թեգերի հետ: Drupal 8.9-ից սկսած (փոփոխության հայտարարություն) փաթեթավորված էկզեմպլյարները ավտոմատ ունեն ավելի կոնկրետ կեշի թեգ, որը ներառում է իրենց փաթեթը, ապահովելու ավելի նպատակային ցանկերի անվավերացում:

Բացի այդ, հնարավոր է սահմանել օգտատիրոջ կողմից որոշված, ավելի կոնկրետ կեշի թեգեր օբյեկտների հատկանիշների հիման վրա, օրինակ՝ տերմինի սղության համար ցուցադրող ցանկերի դեպքում, որոնք ցույց են տալիս տերմինով օբյեկտներ: Նման թեգերի անվավերացումը կարելի է կատարել օգտատիրոջ նախադրամարկղ/ջնջում հարթակներում՝ օրինակ՝

function yourmodule_node_presave(NodeInterface $node) {
  $tags = [];
  if ($node->hasField('field_category')) {
    foreach ($node->get('field_category') as $item) {
      $tags[] = 'mysite:node:category:' . $item->target_id;
    }
  }
  if ($tags) {
    Cache::invalidateTags($tags);
  }
}

Այս թեգերը կարելի է օգտագործել կոդում և Views-ում՝ օգտագործելով Views Custom Cache Tag մոդուլը:

Նշում. Հիմա չկա API, որով կարելի է ստանալ առանձին փաթեթներ և ավելի կոնկրետ կեշի թեգեր օբյեկտից կամ այլ օբյեկտից: Դա կապված է այն բանի հետ, որ որոշող օբյեկտը՝ որ կեշի թեգերը նպատակային են կոնկրետ ցանկի/հարցման համար, կախված է հենց հարցումից: Վերամշակված Drupal-ի ավելի ուշ տարբերակները հավանաբար կբարելավեն կեշ-թեգերի աջակցությունը յուրաքանչյուր փաթեթի համար և, օրինակ, կներառեն դրանք էկզեմպլյարների հարցումների և Views-ի կառուցման մեջ:

Ինչպե՞ս

Կարգավորումներ

Յուրաքանչյուր կեշ-սերվեր պետք է իրականացնի CacheBackendInterface-ը, ուստի երբ կեշի տարր եք տեղադրում ::set() մեթոդով, փոխանցեք երրորդ և չորրորդ արգումենտները, օրինակ՝

$cache_backend->set(
  $cid, $data, Cache::PERMANENT, ['node:5', 'user:7']
);

Սա պահում է կեշի տարրը $cid նույնականացուցիչով անվերջ, բայց դարձնում այն ենթակա անվավերացման node:5 և user:7 թեգերով:

Անվավերացում

Կեշի թեգերով նշված տարրերը անվավերանում են cache_tags.invalidator:invalidateTags() (կամ եթե չեք կարող ներարկել cache_tags.invalidator ծառայությունը՝ օգտագործեք Cache::invalidateTags()), որը ստանում է կեշի թեգերի հավաքածու (string[]):

Նշում. դա անվավերացնում է բոլոր կեշի տարրերը նշված թեգերով բոլոր կեշի բիներում: Այդ պատճառով էլ թեգերով անվավերացնելը անհետևանք է բիների միջեւ, քանի որ փոփոխված տվյալները, որոնց թեգերը անվավեր են, կարող են կախված լինել մյուս բիների կեշի տարրերից:

Տվյալների ստուգում (դեբագ)

Բոլոր նշվածներն օգտակար են, երբ փորձում եք ստուգել կեշավորված բովանդակություն: Բայց կա ևս մեկ կարևոր բան. եթե ինչ-որ տարրը կեշավորվում է հետևյալ թեգերով ['foo', 'bar'], ապա կեշի տարրը կունենա թեգերի սյուն (եթե ենթադրենք, որ դա DB կեշ է) այս տեսքով.

bar foo

Ասածն այն է՝

  • կեշի թեգերը բաժանված են բացատով
  • կեշի թեգերը դասավորված են այբբենական կարգով

Սա հեշտացնում է կեշի վերլուծությունը և դեբագը:

Վերնագրեր (դեբագ)

Վերջապես, հեշտ է տեսնել, թե որ կեշի թեգերից է կախված կոնկրետ պատասխան (և հետևաբար երբ այն անվավեր է լինում)` պարզապես նայելով X-Drupal-Cache-Tags հեդերին:

(Այստեղից էլ է գալիս բացատների արգելքը. Քանի որ X-Drupal-Cache-Tags հեդերը, ինչպես և շատ HTTP հեդերներ, օգտագործում է բացատները արժեքները բաժանելու համար):

Նշում. Եթե չեք տեսնում այս հեդերները, պետք է կարգավորեք Drupal-ի զարգացման միջավայրը:

Համակցում հակադարձ պրոքսիների հետ

Փոխարենը կեշավորելու Drupal-ի պատասխանը և անվավերացնելու այն կեշի թեգերով, դուք կարող եք կեշավորել պատասխանները հակադարձ պրոքսի (Varnish, CDN և այլն) վրա և անվավերացնել կեշավորված պատասխանները՝ օգտագործելով դրանց հետ կապվող կեշի թեգերը: Որպեսզի հակադարձ պրոքսիները իմանան, թե որ թեգեր են կապված յուրաքանչյուր պատասխանին, դուք կարող եք ուղարկել կեշի թեգերը հեդերի միջոցով:

Իսկապես, ինչպես Drupal 8-ն ուղարկում է X-Drupal-Cache-Tags հեդերը դեբագի համար, այնպես էլ կարող է ուղարկել Surrogate-Keys հեդեր՝ արժեքներ բաժանված բացատներով, ինչպես սպասվում է որոշ CDN-ներից, կամ Cache-Tag հեդեր՝ արժեքներ բաժանված ստորակետներով, ինչպես սպասվում է մյուս CDN-ներից: Եվ սա կարող է լինել նաև ինքնավար հակադարձ պրոքսի սերվեր, ոչ միայն կոմերցիոն CDN ծառայություն:

Ընդհանուր առմամբ խորհուրդ է տրվում, որ և ձեր վեբ սերվերն ու հակադարձ պրոքսին աջակցեն մինչև 16 KB հեդերների արժեքներին:

1. HTTP-ն տեքստային է: Կեշի թեգերը հիմնված են տեքստի վրա: Հակադարձ պրոքսիները կարող են ազատ ներկայացնել կեշի թեգերը այլ տվյալների կառուցվածքներում: 16 KB արժեքի սահմանը ընտրվել է երկու գործոնների հիման վրա՝ A) ապահովելու, որ աշխատի 99%-ում, B) գործնականում հասանելի է: Սովորական վեբ սերվերները (Apache) և սովորական CDN-ները (Fastly) աջակցում են մինչև 16 KB արժեքներ: Սա մոտավորապես նշանակում է 1000 կեշի թեգ, ինչը բավական է 99%-ի դեպքերում:
2. Կեշի թեգերի քանակը շատ տարբեր է կայքից և կոնկրետ պատասխանից կախված: Եթե պատասխանն կախված է շատ բաներից, կեշի թեգերը շատ կլինեն: Ավելի քան 1000 կեշի թեգ ունեցող պատասխանները հազվադեպ են:
3. Իհարկե, այս ուղեցույցը (~1000 թեգ/պատասխան) կարող է զարգանալ հետագայում, քանի որ A) ավելի ու ավելի շատ իրական ծրագրեր կիրառում են այն, B) համակարգերը հատուկ օգտագործում և կառուցում են այս հնարավորության վրա:

Վերջում՝ ցանկացած 1000 կեշի թեգերից ավելի մեծ քանակ ցույց է տալիս ավելի խոր խնդիր՝ պատասխանն ավելի բարդ է և պետք է բաժանել: Դուք կարող եք անցնել այս թիվը Drupal-ում, բայց դա կարող է պահանջել ձեռքի կարգավորում, որը ընդունելի է բացառիկ բարդ դեպքերում: Պատահում է նույնիսկ շատ ավելի քիչ քան 1000 թեգերի դեպքում:

Կարդացեք Varnish-ի հետ կեշի թեգերի օգտագործման փաստաթուղթը:

Պատճենվել է, որ CDN-ները աջակցում են թեգերով կեշի անվավերացում/մաքրման հնարավորությունը՝

CloudFlare
Fastly
KeyCDN
Akamai

Ներքին էջի կեշ

Drupal 8-ում կեշի թեգերի համապարփակ օգտագործումը հնարավորություն է տալիս Drupal 8-ին հասանելի լինել նախաձեռնված ներքին էջի կեշով, որը ոչ այլ ինչ է, քան ներդրված հակադարձ պրոքսի:

Դիտարկեք նաև

Source URL:

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.