Модул 6 · 6.4
Скорост и кеширане при онлайн магазин
Модул 6: Управление и сигурност · Време за четене: 10 минути
Учебна цел: След този урок ще можете да настроите кеширането на WooCommerce онлайн магазин така, че магазинът да е бърз, а личните страници никога да не попадат в кеша, и ще можете да проверите това по HTTP заглавките.
Основни понятия: кеш на страници, изключения (количка, плащане, Моят профил), бисквитки, които заобикалят кеша, no-cache заглавки, DONOTCACHEPAGE, обектен кеш, Redis, фрагменти на количката, гео позициониране с кеш на страници, почистване на планираните действия
Два вида страници
Основите на кеширането (кеш на страници, кеш на браузъра, обектен кеш, OPcache, CDN) са описани в курса за WordPress, урок 6.2. Там е посочено и най-важното правило за онлайн магазините: личните страници не бива да попадат в кеша на страници. Този урок разглежда това по-подробно.
Един онлайн магазин има два вида страници:
| Вид | Примери | Кеш |
|---|---|---|
| Еднакви за всички | начална страница, страница на магазина, категории, продуктови страници, информационни страници | Кеш на страници: да, тук е най-голямата полза |
| Различни за всеки посетител | количка, плащане, Моят профил, страницата за отказ от договора при влязъл в профила си клиент | Кеш на страници: никога |
Ако нещо се обърка, ще го забележите веднага: клиент вижда количката на друг човек или, още по-лошо, нечий адрес на страницата за плащане. Това е и нарушение на сигурността на личните данни по смисъла на GDPR (KB 6749).
Какво прави самият WooCommerce
WooCommerce помага на кеша по три начина и е добре да ги познавате, за да забележите, когато нещо ги премахне:
- Константи. На страниците за количка, плащане и Моят профил WooCommerce задава
DONOTCACHEPAGE(както и константи за обектния кеш и кеша на базата данни). Много плъгини за кеширане четат тази константа и в такъв случай пропускат страницата. - Заглавки. На същите страници WooCommerce изпраща no-cache заглавките на WordPress:
Cache-Control: no-cache, must-revalidate, max-age=0, privateиExpiresс дата в миналото. Прокси или CDN, които спазват правилата, тогава не запазват страницата. За влезли в профила си потребители се добавя иno-store. - Бисквитки. Щом някой постави нещо в количката, WooCommerce задава бисквитки като
woocommerce_items_in_cart,woocommerce_cart_hashиwp_woocommerce_session_.... Добрият кеш не дава запазена страница на посетители с такава бисквитка, дори за продуктовите страници, защото например количката в горната част на страницата тогава е различна за всеки посетител.
Документацията на WooCommerce посочва за плъгините за кеширане: изключете количката, Моят профил и плащането, както и бисквитките woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed и store_notice[...]. За Varnish тя дава и правила за адреси с ?add-to-cart=.
Къде се получават проблемите на практика
- Други адреси за страниците на магазина. Преименували сте количката на
/mandje/или плъгин за превод създава/de/warenkorb/. Кеш, който изключва фиксирани адреси като/cart, ги пропуска. Плъгините за кеширане, които познават WooCommerce, четат страниците от настройките; кешът на сървъра или при CDN не прави това. - CDN, който кешира всичко. Някои CDN правила („cache everything“) пренебрегват заглавките. В такъв случай изрично изключете страниците на магазина и посочените бисквитки.
- Плъгин, който презаписва заглавките. Плъгин за сигурност или за скорост понякога задава
Cache-Control: public, max-age=...на всяка страница. Тогава no-cache заглавките вече ги няма. - Сесия за всеки посетител. Обикновено WooCommerce задава бисквитка за сесия едва когато в количката има нещо. Ако плъгин или тема започва сесия за всеки посетител (бисквитка
wp_woocommerce_session_илиPHPSESSIDоще при първото посещение), кешът на страници отпада за всички и Вашият магазин става бавен при натоварване. - Гео позициониране. В WooCommerce > Настройки > Общи избирате местоположението на клиента по подразбиране. При обикновеното „Гео позициониране“ сървърът изчислява държавата за всеки посетител, а при цени по държави това не е съвместимо с кеш на страници. Затова WooCommerce предлага опцията „Гео позициониране (с поддръжка на кеширане на страници)“, която определя държавата чрез допълнителна заявка в браузъра. Ако не Ви трябват цени или ДДС по държави преди плащането, изберете държавата на магазина: това е най-простото. За гео позиционирането WooCommerce периодично изтегля база данни от MaxMind.
На сървър с LiteSpeed (както при WebOké) плъгинът LiteSpeed Cache сам управлява изключенията за WooCommerce; проверете ги в настройките за изключения. При други уеб сървъри и хостинг доставчици това работи по подобен начин с друг плъгин за кеширане.
Какво не решава кешът на страници
Количката и плащането винаги се изграждат от PHP и базата данни. При натоварване (промоция, бюлетин) това са точно страниците, на които Вашите клиенти харчат пари. Там помагат други неща:
- Обектен кеш като Redis пази резултатите от заявките към базата данни в паметта. При онлайн магазин, с много страници, които не могат да бъдат в кеша на страници, това дава осезаемо повече полза, отколкото при обикновен сайт. Вашият хостинг трябва да предлага Redis (при WebOké това е възможно, DA 15.7); след това го включвате с плъгин.
- Фрагменти на количката. Класическите теми обновяват количката в горната част на страницата чрез скрипт (
wc-cart-fragments), който при пълна количка прави допълнителна заявка. Модерните блокови теми с блока за мини количка се нуждаят по-малко от това. Не зареждайте такива скриптове на страници, на които те не вършат нищо. - Почистени планирани действия. WooCommerce използва Action Scheduler за фонови задачи (урок 7.3). Завършените действия по подразбиране се почистват след един месец. Ако списъкът въпреки това нарасне до стотици хиляди, често заради разширение, което постоянно планира нещо, или заради неуспешни действия, заявките към базата данни стават по-бавни. Проверете в WooCommerce > Състояние > Планирани действия броя на неуспешните и чакащите действия.
- HPOS. Поръчките в собствени таблици (урок 1.2) правят търсенето в поръчките по-бързо, отколкото в старата таблица с публикации. Съществуващите магазини трябва сами да преминат към тях (урок 6.2 за резервните копия предварително).
- Актуална версия на PHP и достатъчно памет (урок 7.2).
На практика: ето как изглежда в WooCommerce
Проверете това при Чайна Example от Утрехт (Холандия) в поверителен прозорец с инструментите за разработчици на Вашия браузър (F12, раздел Мрежа, първата заявка):
- Начална страница, заредена два пъти: при второто зареждане заглавка като
x-litespeed-cache: hitилиcf-cache-status: HIT. Няма бисквиткаwp_woocommerce_session_при първото посещение. shop.example.com/winkelwagen/, заредена два пъти: няма hit, аcache-controlсъдържаno-cacheилиprivate.- Същото за плащането и Моят профил.
- Поставете продукт в количката и заредете продуктова страница: виждате собствената си количка, а не запазена версия.
Обобщение
- Страниците, които са еднакви за всички, се кешират; количката, плащането и Моят профил никога.
- WooCommerce сам задава DONOTCACHEPAGE, no-cache заглавки и бисквитки; проверете дали нищо не ги премахва или пренебрегва.
- Внимавайте за преименувани адреси, правила на CDN, плъгини, които презаписват заглавките, сесии за всеки посетител и гео позициониране.
- Redis, почистените планирани действия, HPOS и подходяща версия на PHP помагат там, където кешът на страници не може.
- Тествайте с двукратно зареждане в поверителен прозорец и прочетете заглавките.
Тест (quiz)
Задача
Задача A6.4: Остават ли количката и плащането извън кеша? Въведете адреса на Вашия магазин и адресите на страниците за количка и плащане (и по желание на Моят профил). Програмата заявява началната страница два пъти с 2 секунди между заявките, без бисквитки, а след това и всяка страница на магазина също два пъти. Нищо не се поставя в количката и нищо не се поръчва. Зелено, ако при второто зареждане началната страница идва от кеша (или е видимо по-бърза), без да задава бисквитка за сесия, и ако всяка страница на магазина при второто зареждане няма попадение в кеша и изпраща Cache-Control с no-cache, no-store, private или max-age=0. Оранжево, ако началната страница не използва кеш или ако страница на магазина няма попадение, но няма и no-cache заглавка. Червено при попадение в кеша на количката, плащането или Моят профил, или ако началната страница започва WooCommerce сесия за всеки посетител.
Зелената отметка означава, че тази проверка в момента е наред, а не че Вашият магазин е сигурен.
Прочетете още
Стъпките в контролния панел се отнасят за WebOké; при други доставчици това работи по подобен начин.
- Безплатен курс по WordPress 6.2: Кеширане
- Безплатен курс по WordPress 6.3: Изображения, PHP и други подобрения в скоростта
- Ръководство за DirectAdmin 15.7: Redis
- Уебсайтът ми е бавен или използва твърде много CPU: ето как да го ускорите
- Това изтичане на данни ли е и трябва ли да го съобщя?
- Configuring caching plugins (developer.woocommerce.com, на английски): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
- LiteSpeed Cache за WordPress и онлайн магазин
