Ενότητα 6 · 6.4
Ταχύτητα και caching σε ένα ηλεκτρονικό κατάστημα
Ενότητα 6: Διαχείριση και ασφάλεια · Χρόνος ανάγνωσης: 10 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να ρυθμίσετε το caching για ένα ηλεκτρονικό κατάστημα WooCommerce έτσι ώστε το κατάστημα να είναι γρήγορο και οι προσωπικές σελίδες να μην μπαίνουν ποτέ στην cache. Μπορείτε επίσης να το ελέγξετε από τις κεφαλίδες HTTP.
Βασικές έννοιες: προσωρινή μνήμη σελίδας, εξαιρέσεις (καλάθι, ολοκλήρωση αγοράς, Ο λογαριασμός μου), cookies που παρακάμπτουν την cache, κεφαλίδες no-cache, DONOTCACHEPAGE, object cache, Redis, τμήματα καλαθιού (cart fragments), εντοπισμός γεωγραφικής θέσης με προσωρινή μνήμη σελίδας, καθαρισμός προγραμματισμένων ενεργειών
Δύο είδη σελίδων
Οι βασικές αρχές του caching (προσωρινή μνήμη σελίδας, cache του προγράμματος περιήγησης, object cache, OPcache, CDN) περιγράφονται στο μάθημα WordPress, μάθημα 6.2. Εκεί αναφέρεται ήδη και ο σημαντικότερος κανόνας για τα ηλεκτρονικά καταστήματα: οι προσωπικές σελίδες δεν πρέπει να μπαίνουν στην προσωρινή μνήμη σελίδας. Αυτό το μάθημα τον αναλύει.
Ένα ηλεκτρονικό κατάστημα έχει δύο είδη σελίδων:
| Είδος | Παραδείγματα | Cache |
|---|---|---|
| Ίδιες για όλους | αρχική σελίδα, σελίδα καταστήματος, κατηγορίες, σελίδες προϊόντων, σελίδες πληροφοριών | Προσωρινή μνήμη σελίδας: ναι, εδώ βρίσκεται το μεγαλύτερο όφελος |
| Διαφορετικές για κάθε επισκέπτη | καλάθι, ολοκλήρωση αγοράς, Ο λογαριασμός μου, η σελίδα υπαναχώρησης με συνδεδεμένο πελάτη | Προσωρινή μνήμη σελίδας: ποτέ |
Αν κάτι πάει στραβά, το βλέπετε αμέσως: ένας πελάτης βλέπει το καλάθι κάποιου άλλου ή, ακόμη χειρότερα, τη διεύθυνση κάποιου άλλου στη σελίδα ολοκλήρωσης αγοράς. Αυτό αποτελεί επίσης παραβίαση δεδομένων κατά την έννοια του GDPR (KB 6749).
Τι κάνει ήδη το ίδιο το WooCommerce
Το WooCommerce βοηθά μια cache με τρεις τρόπους. Καλό είναι να τους γνωρίζετε, ώστε να καταλαβαίνετε πότε κάτι τους αναιρεί:
- Σταθερές. Στο καλάθι, στην ολοκλήρωση αγοράς και στο Ο λογαριασμός μου, το WooCommerce ορίζει
DONOTCACHEPAGE(καθώς και αντίστοιχες σταθερές για object cache και cache βάσης δεδομένων). Πολλά πρόσθετα cache διαβάζουν αυτή τη σταθερά και παραλείπουν τη σελίδα. - Κεφαλίδες. Στις ίδιες σελίδες το WooCommerce στέλνει τις κεφαλίδες no-cache του WordPress:
Cache-Control: no-cache, must-revalidate, max-age=0, privateκαι μιαExpiresμε ημερομηνία στο παρελθόν. Ένας proxy ή ένα CDN που τηρεί τους κανόνες δεν αποθηκεύει τότε τη σελίδα. Για συνδεδεμένους χρήστες προστίθεται και τοno-store. - Cookies. Μόλις κάποιος βάλει κάτι στο καλάθι, το WooCommerce ορίζει cookies όπως
woocommerce_items_in_cart,woocommerce_cart_hashκαιwp_woocommerce_session_.... Οι καλές cache δεν δίνουν πλέον αποθηκευμένη σελίδα σε επισκέπτες με τέτοιο cookie, ούτε για σελίδες προϊόντων, επειδή για παράδειγμα το καλάθι στην κεφαλίδα της σελίδας διαφέρει τότε ανά επισκέπτη.
Η τεκμηρίωση του WooCommerce συστήνει για τα πρόσθετα cache: εξαιρέστε τις σελίδες καλάθι, Ο λογαριασμός μου και ολοκλήρωση αγοράς, καθώς και τα cookies woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed και store_notice[...]. Για το Varnish δίνει επίσης κανόνες για διευθύνσεις με ?add-to-cart=.
Πού στραβώνει στην πράξη
- Άλλες διευθύνσεις για τις σελίδες του καταστήματος. Έχετε μετονομάσει το καλάθι σε
/mandje/ή ένα πρόσθετο μετάφρασης δημιουργεί/de/warenkorb/. Μια cache που εξαιρεί σταθερές διευθύνσεις όπως/cartδεν τις πιάνει. Τα πρόσθετα cache που γνωρίζουν το WooCommerce διαβάζουν τις σελίδες από τις ρυθμίσεις· μια cache στον server ή σε ένα CDN δεν το κάνει. - Ένα CDN που αποθηκεύει τα πάντα. Ορισμένοι κανόνες CDN ("cache everything") αγνοούν τις κεφαλίδες. Σε αυτή την περίπτωση εξαιρέστε ρητά τις σελίδες του καταστήματος και τα παραπάνω cookies.
- Ένα πρόσθετο που αντικαθιστά τις κεφαλίδες. Ένα πρόσθετο ασφαλείας ή ταχύτητας ορίζει μερικές φορές σε κάθε σελίδα
Cache-Control: public, max-age=.... Τότε οι κεφαλίδες no-cache δεν υπάρχουν πλέον. - Μια συνεδρία για κάθε επισκέπτη. Κανονικά το WooCommerce ορίζει cookie συνεδρίας μόνο όταν υπάρχει κάτι στο καλάθι. Αν ένα πρόσθετο ή θέμα ξεκινά ήδη συνεδρία για κάθε επισκέπτη (ένα cookie
wp_woocommerce_session_ήPHPSESSIDαπό την πρώτη επίσκεψη), η προσωρινή μνήμη σελίδας χάνεται για όλους και το κατάστημά σας γίνεται αργό όταν έχει κίνηση. - Εντοπισμός γεωγραφικής θέσης. Στο WooCommerce > Ρυθμίσεις > Γενικά επιλέγετε την προεπιλεγμένη τοποθεσία ενός πελάτη. Με τον απλό "Εντοπισμός γεωγραφικής θέσης" ο server υπολογίζει τη χώρα για κάθε επισκέπτη, και όταν οι τιμές διαφέρουν ανά χώρα αυτό δεν συνδυάζεται με προσωρινή μνήμη σελίδας. Γι' αυτό το WooCommerce έχει την επιλογή "Εντοπισμός γεωγραφικής θέσης (με υποστήριξη προσωρινής αποθήκευσης σελίδων)", η οποία προσδιορίζει τη χώρα μέσω ενός επιπλέον αιτήματος στο πρόγραμμα περιήγησης. Αν δεν χρειάζεστε τιμές ή ΦΠΑ ανά χώρα πριν από την ολοκλήρωση αγοράς, επιλέξτε τη χώρα του καταστήματος: είναι η απλούστερη λύση. Για τον εντοπισμό γεωγραφικής θέσης το WooCommerce κατεβάζει περιοδικά μια βάση δεδομένων της MaxMind.
Σε έναν server LiteSpeed (όπως στη WebOké) το πρόσθετο LiteSpeed Cache ρυθμίζει μόνο του τις εξαιρέσεις για το WooCommerce· ελέγξτε τις στις ρυθμίσεις εξαιρέσεων. Σε άλλους web servers και παρόχους hosting λειτουργεί παρόμοια με ένα άλλο πρόσθετο cache.
Τι δεν λύνει η προσωρινή μνήμη σελίδας
Το καλάθι και η ολοκλήρωση αγοράς δημιουργούνται πάντα από την PHP και τη βάση δεδομένων. Όταν υπάρχει κίνηση (μια προσφορά, ένα newsletter), αυτές είναι ακριβώς οι σελίδες όπου οι πελάτες σας ξοδεύουν χρήματα. Εκεί βοηθούν άλλα πράγματα:
- Μια object cache όπως το Redis κρατά στη μνήμη το αποτέλεσμα των ερωτημάτων στη βάση δεδομένων. Σε ένα ηλεκτρονικό κατάστημα, με πολλές σελίδες που δεν μπορούν να μπουν στην προσωρινή μνήμη σελίδας, αυτό αποδίδει αισθητά περισσότερο απ' ό,τι σε έναν απλό ιστότοπο. Το hosting σας πρέπει να προσφέρει Redis (στη WebOké είναι δυνατό, DA 15.7)· στη συνέχεια το ενεργοποιείτε με ένα πρόσθετο.
- Τμήματα καλαθιού. Τα κλασικά θέματα ενημερώνουν το καλάθι στην κεφαλίδα της σελίδας με ένα script (
wc-cart-fragments) που κάνει ένα επιπλέον αίτημα όταν το καλάθι έχει περιεχόμενο. Τα σύγχρονα θέματα μπλοκ με το μπλοκ μίνι καλαθιού το χρειάζονται λιγότερο. Μη φορτώνετε τέτοια scripts σε σελίδες όπου δεν κάνουν τίποτα. - Καθαρισμένες προγραμματισμένες ενέργειες. Το WooCommerce χρησιμοποιεί το Action Scheduler για εργασίες στο παρασκήνιο (μάθημα 7.3). Οι ολοκληρωμένες ενέργειες διαγράφονται από προεπιλογή μετά από έναν μήνα. Αν η λίστα φτάσει παρ' όλα αυτά σε εκατοντάδες χιλιάδες, συχνά λόγω μιας επέκτασης που προγραμματίζει συνεχώς κάτι ή λόγω αποτυχημένων ενεργειών, τα ερωτήματα στη βάση δεδομένων γίνονται πιο αργά. Ελέγξτε στο WooCommerce > Κατάσταση > Προγραμματισμένες ενέργειες το πλήθος των αποτυχημένων και των εκκρεμών ενεργειών.
- HPOS. Οι παραγγελίες σε δικούς τους πίνακες (μάθημα 1.2) κάνουν την αναζήτηση στις παραγγελίες ταχύτερη απ' ό,τι στον παλιό πίνακα άρθρων. Τα υπάρχοντα καταστήματα πρέπει να κάνουν μόνα τους τη μετάβαση (μάθημα 6.2 για τα αντίγραφα ασφαλείας εκ των προτέρων).
- Μια σύγχρονη έκδοση PHP και αρκετή μνήμη (μάθημα 7.2).
Στην πράξη: πώς φαίνεται στο WooCommerce
Ελέγξτε το στο Theehuis Example σε ένα ιδιωτικό παράθυρο με τα εργαλεία προγραμματιστή του προγράμματος περιήγησής σας (F12, καρτέλα Δίκτυο, πρώτο αίτημα):
- Αρχική σελίδα, φόρτωση δύο φορές: τη δεύτερη φορά μια κεφαλίδα όπως
x-litespeed-cache: hitήcf-cache-status: HIT. Κανένα cookiewp_woocommerce_session_στην πρώτη επίσκεψη. shop.example.com/winkelwagen/, φόρτωση δύο φορές: κανένα hit, καιcache-controlμεno-cacheήprivate.- Το ίδιο για την ολοκλήρωση αγοράς και το Ο λογαριασμός μου.
- Βάλτε ένα προϊόν στο καλάθι και φορτώστε μια σελίδα προϊόντος: βλέπετε το δικό σας καλάθι, όχι μια αποθηκευμένη έκδοση.
Σύνοψη
- Οι σελίδες που είναι ίδιες για όλους μπαίνουν στην cache· το καλάθι, η ολοκλήρωση αγοράς και το Ο λογαριασμός μου ποτέ.
- Το WooCommerce ορίζει μόνο του DONOTCACHEPAGE, κεφαλίδες no-cache και cookies· ελέγξτε ότι τίποτα δεν τα αφαιρεί ή τα αγνοεί.
- Προσέξτε τις μετονομασμένες διευθύνσεις, τους κανόνες CDN, τα πρόσθετα που αντικαθιστούν κεφαλίδες, τις συνεδρίες για κάθε επισκέπτη και τον εντοπισμό γεωγραφικής θέσης.
- Το Redis, οι καθαρισμένες προγραμματισμένες ενέργειες, το HPOS και μια καλή έκδοση PHP βοηθούν εκεί όπου η προσωρινή μνήμη σελίδας δεν μπορεί.
- Δοκιμάστε φορτώνοντας δύο φορές σε ιδιωτικό παράθυρο και διαβάστε τις κεφαλίδες.
Κουίζ
Άσκηση
Άσκηση A6.4: Μένουν το καλάθι και η ολοκλήρωση αγοράς εκτός cache; Συμπληρώστε τη διεύθυνση του καταστήματός σας και τις διευθύνσεις της σελίδας καλαθιού και της σελίδας ολοκλήρωσης αγοράς (και προαιρετικά του Ο λογαριασμός μου). Το πρόγραμμα ζητά την αρχική σελίδα δύο φορές με 2 δευτερόλεπτα διαφορά, χωρίς cookies, και στη συνέχεια κάθε σελίδα του καταστήματος επίσης δύο φορές. Δεν μπαίνει τίποτα στο καλάθι και δεν γίνεται καμία παραγγελία. Πράσινο, αν η αρχική σελίδα τη δεύτερη φορά έρχεται από την cache (ή είναι σαφώς ταχύτερη) χωρίς να ορίζει cookie συνεδρίας, και αν κάθε σελίδα του καταστήματος τη δεύτερη φορά δεν έχει cache hit και στέλνει Cache-Control με no-cache, no-store, private ή max-age=0. Πορτοκαλί, αν η αρχική σελίδα δεν χρησιμοποιεί cache ή αν μια σελίδα του καταστήματος δεν έχει hit αλλά ούτε και κεφαλίδα no-cache. Κόκκινο, αν υπάρχει cache hit στο καλάθι, στην ολοκλήρωση αγοράς ή στο Ο λογαριασμός μου, ή αν η αρχική σελίδα ξεκινά συνεδρία WooCommerce για κάθε επισκέπτη.
Ένα πράσινο σημάδι σημαίνει ότι αυτός ο έλεγχος είναι τώρα σωστός, όχι ότι το κατάστημά σας είναι ασφαλές.
Περαιτέρω ανάγνωση
Τα βήματα σε έναν πίνακα ελέγχου ισχύουν για τη WebOké· σε άλλους παρόχους λειτουργεί παρόμοια.
- Δωρεάν μάθημα WordPress 6.2: Caching
- Δωρεάν μάθημα 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/
