數據庫中的 wp_woocommerce_sessions 太大 [如何修復]

正如我在其他文章中所說的, WooCommerce 是一個越來越強大和靈活的模塊,能夠將 WordPress 變成一個 初創企業的理想在線商店.

對於一個普通的在線商店,WooCommerce 可以運行在“共享主機”上,如果使用的主題不消耗太多資源並且不濫用其他模塊(插件),則可以輕鬆支持每天 5.000 個產品/100 個訂單。

源代碼優化 WP 主題、模塊(WP 插件)和 數據庫優化 還有兩個方面我們需要非常小心。

前幾天我注意到一家不起眼的網上商店正在開張 在專用服務器上消耗大量 RAM 和 CPU 資源 慷慨的。 這種高資源消耗導致服務器上的“負載”增加以及在線商店頁面的長時間加載。

當我們發現 Web 服務器上出現不合理的高負載時,最好在採取任何措施之前仔細調查原因。

在數據庫中,我注意到表“wp_woocommerce_sessions“它超大。 它有超過 6 GB。 數據庫中一個表的巨大容量,通常總共不超過 100 MB。

wp_woocommerce_sessions 是什麼?

從他的名字我們可以猜到,這張桌子“wp_woocommerce_sessions”包含 PHP 會話 (PHP會話).
這些會話是站點用戶(或網絡機器人)的操作,大多數情況下他們通過 cookie 訪問數據庫。 在 wp_woocommerce_sessions 中存儲了有關用戶放入購物車的產品的數據、優惠券、運費、客戶數據以及與產品訂購過程相關的許多其他信息。

無論用戶是否在站點上註冊,都會創建這些會話,並且通常會在一段時間後自動過期並刪除。

不幸的是,這些會話並不總是被刪除,並且在某些情況下它們會永久存儲在 wp_woocommerce_sessions 中,這使得該表非常大。

如何刪除表 wp_woocommerce_sessions 從SQL?

1。 到 我的帳戶 →  WooCommerce →  狀態 →  工具 (標籤)。

2.向下滾動到選項“清除客戶會話“。 小心! 刪除客戶會話意味著刪除他們放入購物車的所有產品。 如果在刪除這些會話時,購物車中有產品的客戶將消失,並且可能無法完成在線訂單。

3. 單擊“清除”並確認操作。

此時“wp_woocommerce_sessions”表為空,因此所有客戶購物會話都已刪除。

問題遠未解決。 wp_woocommerce_sessions SQL 表將再次收集其中的數據,默認情況下它會再次獲得比例,這是不可取的。

我們如何阻止客戶會話永久存儲在 WooCommerce 中 - wp_woocommerce_sessions?

上面我們已經展示瞭如何從數據庫中清空“wp_woocommerce_sessions”表,但是當客戶會話再次聚集時,問題會在幾天后再次出現。

在 WooCommerce 2.5 之前,客戶會話是通過 cookie 捕獲的,然後將其保存在 WordPress 表中。”wp_options“。
對於較大的商店,這種方法經常導致災難。 “Wp_options”是 WordPress 的重要表,用於一般選項和設置。 識別和手動刪除存儲在 wp_options 這不是一件容易的事。
WooCommerce 的性能並不是最好的,隨著時間的推移可擴展性是一個敏感點。

隨著 2.5 年 WooCommerce 2015 的推出,WooCommerce 開發人員引入了一個新的 WooCommerce 會話處理和存儲系統,基於 WP 會話管理器. 這個系統導致了出現 wp_woocommerce_sessions. 客戶端會話的專用表,在數據庫中不與其他表交互。 如果出現重大錯誤,損失應該是最小的。

據我所知,在 WooCommerce 2.5 之前推出的在線商店隨著時間的推移不斷收到更新,在自動刪除客戶端會話方面存在一些問題。 很可能是出現在較新版本的 WooCommerce 2.5 或 WordPress / WooCommerce 插件上的錯誤,但沒有跟上更新。

在我的情況下,它與添加到文件中的函數發生衝突 functions.php 的主題,以及 防止在會話過期後自動刪除 woocommerce_sessions.
如果您遇到此類問題,您必須仔細調查所有可能的原因。 SQL 錯誤、SQL 權限、Cron 作業、與其他插件衝突,最後但並非最不重要的是檢查您在代碼中所做的更改。

我們看到 WooCommerce 僅提供 29 美元一個能夠管理客戶會話的插件。 “清除 WooCommerce 的購物車和會話“。 當然,除了預定的會話刪除之外,該模塊還有幾個可以幫助您的工具。

更簡單的選擇 預定刪除“woocommerce_sessions”每隔一天, 可在以下代碼中使用 functions.php:

// clean cart every day
if (!wp_next_scheduled('cron_wc_clean_cart')) {
    wp_schedule_event( time(), 'daily', 'cron_wc_clean_cart' );
}

add_action ( 'cron_wc_clean_cart', 'wc_clean_session_cart' );
function wc_clean_session_cart() {
    global  $wpdb;

    $wpdb->query( "TRUNCATE {$wpdb->prefix}woocommerce_sessions" );
    $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key='_woocommerce_persistent_cart_" . get_current_blog_id() . "';" );
    wp_cache_flush();
}

如果您需要幫助或有其他解決方案,請發表評論。

對技術充滿熱情,我喜歡測試和編寫有關操作系統的教程 macOS,Linux, Windows, 關於 WordPress、WooCommerce 和 LEMP Web 服務器配置(Linux、NGINX、MySQL 和 PHP)。 我寫在 StealthSettings.com 自 2006 年以來,幾年後我開始撰寫 iHowTo.Tips 教程和有關生態系統中設備的新聞 Apple: iPhone,iPad, Apple 手錶,HomePod, iMac, MacBook、AirPods 和配件。

發表評論