FastCGI Cache 快取 WooCommerce 的問題

Woocommerce Shopping Cache

WordPress 的 WooCommerce 購物車快取的問題,現在的快取外掛,多數可以處理購物車 (cart)、結帳頁 (checkout)、帳號登陸頁 (account) 快取的問題,只要這三個部分不做快取,購物功能是不會有影響。

如果是用主機端直接做 Nginx FastCGI Cache,因為是 Page Cache 方式,所以在 WooCommerce 部分,也會一起被快取,會發生明明把商品放進購物車內了,查看購物車後,還是顯示 0 物品。

在 EasyEngine 或 Webinoly 中,Nginx FastCGI Cache 會加入 woocommerce_items_in_cart 參數,當使用者選購商品放入購物車後,快取模式會取消。

當使用者結帳完畢後,才會回到網站的快取模式。

這是一個最安全的做法,但會有一個小瑕疵:

當使用者的購物車有一樣商品,然後繼續購物,這時瀏覽網站時,已經沒有快取效果,直接與資料庫的連結,屬於動態網頁了;如果線上人數很多,購物車裡都有商品,這時的主機負載會變得很大。

所以,希望是當使用者購物車有商品時,只有購物車、結賬頁、登陸頁不要有快取,其他頁面 (商品頁) 還是有快取的狀態,使用者繼續挑選商品時,頁面還是有快取的狀態。

Advertisement

修改 FastCGI Cache 快取

打開 wpfc.conf 文件 (適用於 EasyEngine 與 Webinoly)

# Don't use the cache for logged in users or recent commenter or customer with items in cart
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart") {
   set $skip_cache 1;
}

修改為

# Don't use the cache for logged in users or recent commenter or customer with items in cart
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
   set $skip_cache 1;
}

下方再加入以下配置:(關閉購物車、結賬頁、登陸頁快取功能)

# Don't cache shopping basket, checkout or account pages
if ($request_uri ~* "/cart/*$|/checkout/*$|/my-account/*$") {
   set $skip_cache 1;
}

檢查一次 conf 是否正確,重啟 nginx

nginx -t && service nginx restart

可以開啟 Chrome F12 檢查頁面是否有正確的快取

FastCgi Cache

結語:

我個人的心得,WooCommerce 購物車的快取機制,是不好做的,從商品放入購物車後,很多情形下是沒有快取,即使商品頁面繼續維持快取狀態,當使用者使用「篩選」方式後,又會變成沒有快取的狀態,這時的資料庫的負載是蠻大的,還好 FastCGI Cache 還可以加入 redis 或 memcached 來降低一點負載。

有人問我 WP Rocket 可不可以也加入 redis 或 memcached 來做資料庫快取,這個我沒試過效果如何,去年就有使用者建議 WP Rocket 加入 memcached 的選項,好像沒有被官方採納,連結如下:

Save the cache in Memcache instead of disk (props Martin Boose) Elegantt data. What's this? ( (Elegantt_data:dont_delete{"ignored":false,"autoPlanned":true,"p...

WP Rocket 文檔,加入 Memcached 外掛

WP Rocket does not have any interaction with Memcached - it is a totally separate caching system. You may use them at the same time without issue. There is no i

參考資料:

WooCommerce Window Shopping Caching Technique

This article describes a very aggressive full-page caching techniques for Woo-Commerce stores. We are using this technique from long time and even talked about ...

Webinoly 安裝 VPS 教學系列文章:

1. Webinoly 快速安裝 WordPress 教學

Webinoly 是由 QR Consultoría 的首席 IT 顧問 Cristhian Martinez 所發佈的一支免費 Linux Shell Script,它沿用了 EasyEngine 大部分的功能,並小幅度的改進及更新,在 VPS 上更容易的建置 WordPress;Webinoly 簡單一個指令,就會在 VPS 主機上自動安裝 Linux Ubuntu + Nginx + MariaDB + PHP7.1 + FastCGI Cache。

2. Webinoly 安裝後如何更改 PHP 版本

Webinoly 預設安裝,是很有佛心安裝 PHP 7.1 version,但是不是很多網站的 WordPress 主題或外掛可以接受 PHP 7.1 的新語法,造成許多的 php-errors 或有的功能不能用。我的前一個主題 MyThemeShop TruePixel Themes 就被雷到,與另一個外掛衝突的嚴重。

3. FastCGI Cache 快取 WooCommerce 的問題

4. Webinoly 的 Zend Opcache 性能優化

PHP 於 5.6 版後,Debian / Ubuntu 預設都內建 Zend Opcache,Opcache 是 PHP 優化加速模組,PHP7.0 配合 Opcache 快取功能,更能提升 PHP7.0 的速度。Webinoly 預設安裝,Opcache 已經啟用,預設值為 64MB,實際在 2G RAM VPS 運作中,有點不夠用,無法達到高命中率 (hits),修改 PHP 配置,優化 Opcache 性能。

5. Webinoly 的 Memcached 性能優化

Memcached 是一個免費開源並且高性能的分佈式記憶體對象緩存系統,主要用於加速動態 Web 程序,減輕數據庫負載,再簡單的說,Memcached 是專為數據庫的快取機制。Webinoly 預設安裝,Memcached 已經啟用,預設值為 64MB,實際上是不夠網站快取運作,修改 /etc/memcached.conf 配置,優化 Memcached 性能。

6. 阻擋 MJ12bot 惡意蜘蛛訪問

MJ12bot 蜘蛛是一隻來自英國的搜索引擎網站,照理說搜索引擎的蜘蛛是不該擋掉的,如果你用到一個小記憶體或 CPU 很爛的 VPS,一下子就會被 MJ12bot 蜘蛛搞掛掉;他不像一般正常的 Googlebot,文件爬完後就離開,MJ12bot 一來就是好幾個小時,造成服務器極大的壓力。

7. Webinoly 安裝 VPS 教學

VPS 服務器上安裝 Webinoly 安裝包是非常容易,它優化了 LNMP WEB 服務性能,增強 WordPress 後台登錄的安全性,讓您的網站更可靠的配置。我在前幾篇文章中,有簡單的介紹 Webinoly 安裝方法,這一篇裡,會更詳細介紹 Webinoly 安裝及功能,更容易上手 VPS 服務器。

8. Webinoly 安裝 VPS 教學 – 進階版

Webinoly 是 LNMP (LEMP) 自動安裝的一個程序,簡單、快速在您的 VPS 主機,並且自動配置和優化您自己的 VPS 伺服器;Linux Ubuntu + Nginx + MariaDB + PHP 7.3 是您的網站的最可靠配置之一,通過 Webinoly 一步安裝完成。

Featured Photo by Georgy Rudakov on Unsplash

yungke
Follow me
Back to top