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 的選項,好像沒有被官方採納,連結如下:

Organize anything, together. Trello is a collaboration tool that organizes your projects into boards. In one glance, know what's being worked on, who's working ...

WP Rocket 文檔,加入 Memcached 外掛

WP Rocket does not have an option for Memcached included, but you can set up and use Memcached along with WP Rocket with no issues, by using an additional p

參考資料:

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

Follow me

yungke

視咖啡如命的癮君子,沒有厲害的技術,只會小打小鬧的電腦工程師,其實是個打雜小弟,修電燈、水管也都是我的工作。
yungke
Follow me
Back to top