WordPress Cookies和PHP會話——你需要知道的一切

WordPress Cookies和PHP會話——你需要知道的一切

Cookies是由一位名叫Lou Montulli的計算機程式設計師於1994年首次發明的。沒有它們,網路將是一個完全不同的地方。無論您是登入WordPress網站的後端還是關閉煩人的彈出視窗,您每天都會使用cookie並與之互動(即使您沒有意識到)。

到目前為止,您可能已經猜到,當我們提到cookie時,我們指的是用於在網站上儲存重要訪問者資訊的cookie ,而不是美味的巧克力片。

今天我們將深入探討cookie和PHP會話這個有時令人困惑的話題。具體來說,您需要了解有關WordPress如何使用它們的所有資訊,以及在託管您的網站、自定義程式碼或使用第三方外掛時應該注意的一些常見問題(尤其是作為開發人員)。在我們看來,這個話題討論得還不夠。

什麼是Cookie?

cookie(也稱為網路cookie、跟蹤cookie、HTTP cookie、瀏覽器cookie)是使用者瀏覽器(Chrome、Firefox 等)在訪問網站時儲存的一小段資料。它包含有關瀏覽活動的資訊,通常用於個性化使用者體驗或用於身份驗證和驗證目的。會話cookie和永續性cookie是常見的cookie型別。

Cookie的型別

通常設定兩種不同型別的cookie:會話cookie永續性cookie

會話Cookie

會話cookie,也稱為臨時cookie,是臨時的。它們沒有附加到期日期,僅儲存有關使用者在單個會話期間所做操作的資訊。會話只是當有人訪問網站時分配的隨機生成/唯一值。會話cookie臨時儲存在記憶體中,並在瀏覽器關閉或會話結束時自動刪除。

永續性Cookie

正如您可能已經猜到的那樣,永續性cookie是那些包含過期日期的cookie。這些持續時間更長,並儲存在磁碟上,直到它們過期或由使用者手動清除 。這些有時也稱為“跟蹤cookie”,因為這些是Google Analytics、AdRoll、Stripe等都使用的cookie型別。

我們的返利聯盟計劃是另一個例子。當使用者點選附屬連結時,會在使用者的瀏覽器中放置一個60天的cookie。這可以確保推薦人獲得適當的信用,即使此人已多次關閉並重新開啟其瀏覽器。

WordPress核心如何使用Cookie

當我們提到WordPress核心時,我們只是指在安裝任何第三方外掛或主題之前構成開源專案的檔案。它是我們喜歡稱之為自然狀態的WordPress。

現在您已經瞭解了cookie是什麼以及不同型別的基礎知識,讓我們來看看WordPress核心為什麼以及如何使用它們來使所有這些魔術在幕後發生。有趣的事實Cookie最初源自“magic cookie”一詞。

WordPress核心將cookie用於兩個不同的目的:

1. 登入Cookie

登入cookie包含身份驗證詳細資訊,並在使用者登入WordPress管理儀表盤時使用。根據WordPress Codex,設定了幾個不同的會話cookie:

  • 登入時,WordPress使用wordpress_[hash]cookie儲存身份驗證詳細資訊(僅限該/wp-admin/區域)。
  • 登入後,WordPress設定wordpress_logged_in_[hash]cookie。這表明您何時登入以及您是誰。

當您嘗試訪問WordPress網站的後端時,會檢查上述兩個cookie是否存在並且尚未過期。這就是讓您神奇地繞過 wp-login.php頁面的原因。

WordPress還設定wp-settings-{time}-[UID]cookie。ID是WordPress使用者資料庫表中的使用者ID。這儲存個人儀表板和管理介面設定。

2.評論Cookie

預設情況下,當有人對部落格文章發表評論時會設定cookie(有效期為347天)。因此,如果他們稍後回來,他們不必重新填寫所有資訊。儲存了以下三個cookie:

  • comment_author_[hash]
  • comment_author_email_[hash]
  • comment_author_url_[hash]

但是,由於GDPR最近對隱私政策進行了更改,WordPress核心引入了新工具,以確保您讓使用者選擇加入這些正在設定的cookie。此設定(如果尚未設定)可以在WordPress管理儀表盤的“設定 → 討論”下啟用。選擇“顯示評論cookies覈取方塊,允許設定評論者cookies。”選項。流行的Akismet外掛還允許您顯示隱私宣告。

評論cookie如何選擇加入

評論cookie如何選擇加入

第三方WordPress外掛和主題如何使用Cookie

就像WordPress將cookie用於某些功能一樣,您安裝的第三方外掛和主題也會設定cookie。他們中的大多數使用儲存在wp_options表或他們自己的自定義表中的瀏覽器cookie和資料庫行的組合。這是因為WordPress是無狀態的。

無狀態應用程式是一種應用程式,它不會儲存在一個會話中生成的客戶端資料,以便在與該客戶端的下一個會話中使用。每個會話都像第一次一樣進行,響應不依賴於前一個會話的資料。–TechTarget

有了新的隱私法,真正瞭解設定了哪些cookie以及它們是否為訪問者提供了選擇加入的方式比以往任何時候都更加重要。提示:並非所有cookie都需要選擇加入。

以下只是cookie用途的眾多示例中的幾個:

  • 如果您的WordPress網站上有一個彈出框並且訪問者將其關閉,這通常會設定一個cookie,以便它不會再次出現。
  • 在您的電子商務網站上新增到購物車的商品。儲存cookie以便購物車在您繼續瀏覽網站時保留您的產品。
  • IP地理位置功能可能會儲存瀏覽該站點的訪問者的IP地址和緯度/經度座標。這通常用於向特定區域顯示特定內容,甚至可能將使用者重定向到不同的子站點。
  • 使用PrettyLinks外掛等連結縮短器跟蹤點選活動。
  • 如果使用者已經訂閱,通訊外掛可能會為他們設定一個cookie,這可以完全隱藏通訊框。

基本上,在WordPress網站上的任何操作或選擇加入,通常都會涉及在幕後在瀏覽器中設定cookie。當然,這樣做的目的是嘗試幫助改善瀏覽器體驗或通過驗證提供額外的功能。

WooCommerce Cookie

諸如WooCommerce之類的電子商務外掛通常會設定自己的附加cookie,以便買家可以輕鬆地將商品新增到購物車、儲存以供以後結帳以及登入和退出帳戶。

為了跟蹤購物車資料,WooCommerce設定了以下三個cookie  (cookie中不儲存個人資訊):

  • woocommerce_cart_hash
  • woocommerce_items_in_cart
  • wp_woocommerce_session_

前兩個cookie包含有關購物車的資訊,只是幫助WooCommerce知道購物車資料何時更改。第三個cookiewp_woocommerce_session_包含每個客戶的唯一程式碼,該程式碼對應於資料庫中自定義wp_woocommerce_sessions表中的條目。

wp_woocommerce_sessions表

wp_woocommerce_sessions表

wp_commerce_session_資料之前儲存在wp_options表中,但在WooCommerce 2.5中引入了新的會話處理程式時,它們被移動到了自己的自定義表中。這是為了提高效能、可伸縮性和會話管理。否則,您很快就會得到一個必須清理的臃腫的wp_options表

Easy Digitial Downloads Cookie

Easy Digital Downloads預設使用WP_Session,它是瀏覽器cookie和儲存在wp_options表中的資料庫行的組合。下面是它設定的cookie:

  • edd_items_in_cart

Cookie和WordPress快取

說到WordPress快取,這就是事情變得棘手的地方。快取本質上是儲存來自一個請求的資源並將這些資源重用於後續請求的過程。基本上,它減少了生成頁面檢視所需的工作量。雖然這對效能很有好處,但在涉及cookie時會引起問題。

為什麼?因為cookie用於執行特定操作,例如在您瀏覽WooCommerce網站時保持購物車的填充。但是,如果頁面是從快取中提供的,那麼PHP和資料庫都不會做任何事情,伺服器只會提供頁面的靜態副本。

所以,你可以做什麼?

1. 使用JavaScript

第一個選項是使用JavaScript並動態更新頁面上的內容。基本上,您有HTML佔位符並使用JavaScript通過API或ajax呼叫獲取資訊。

一個示例是通過使用JavaScript在wp-api上獲取文章列表,然後在側邊欄中呈現它們,從而在WordPress側邊欄中載入文章列表。在這種情況下,您可以在不從快取中清除頁面的情況下更新文章列表,因為資料是動態生成的。

雖然這並不理想,但在效能方面,如果可能的話,快取總是更好。但是,如果您必須讓一些內容保持動態,而頁面本身可以保持靜態(從快取中提供),這是一種方法 – 使用JavaScript通過API/ajax動態下拉頁面該部分的內容稱呼。但是,除非您可以聘請WordPress開發人員來構建自定義JavaScript解決方案或外掛擴充套件,否則此選項通常不實用。

2. 使用Admin-Ajax呼叫

Admin-ajax.php無法快取,因此您可以使用admin-ajax呼叫。No Cache AJAX Widgets外掛就是一個很好的例子。它進行admin-ajax呼叫,因此不必擔心與伺服器級或第三方快取解決方案發生衝突。

然而,就像使用JavaScript一樣,沿著這條路線走對於普通使用者來說通常是不可行的。它還可能導致其他效能問題,例如高admin-ajax使用率 和大量未快取請求。

除非您可以使用JavaScript或admin-ajax路由,否則當存在特定cookie時將頁面從快取中排除是最好的方法。這通常是我們推薦的,尤其是那些執行高度動態網站的網站,例如WooCommerce和Easy Digital Downloads。

在設定快取的時候,我們應該將某些WooCommerce和Easy Digital Downloads頁面(例如購物車、我的帳戶和結帳)設定自動從快取中排除。比如設定伺服器級別的規則,以便使用者在檢測到woocommerce_items_in_cartcookie 或 edd_items_in_cartcookie時自動繞過快取,以確保順利和同步的結帳過程。

當我們檢測到有人登入WordPress時,我們還會偵聽相關的登入cookie並將快取設定為繞過。這可以防止後端儀表板意外被快取。

預設情況下,我們不會wp_woocommerce_session_從快取中排除cookie。根據我們的經驗,大多數WooCommerce網站都沒有任何問題。這還通過增加快取HIT比率來提高效能,同時使用更少的PHP workers

但是,由於有許多不同的WordPress主題和外掛配置,wp_woocommerce_session_如果需要,我們可以從快取中排除cookie。只需聯絡我們的支援團隊。結果是,一旦使用者將產品新增到他們的購物車中,所有後續請求都不會從快取中得到處理,從而增加了PHP worker的使用率。

如果您需要從快取中排除的自定義頁面,請隨時與我們的支援團隊開票。同樣,您必須小心excludes。太多未快取的頁面確實會降低效能。

如何檢視和清除Cookie

在網站上檢視和清除cookie很容易。要檢視在特定站點上設定了哪些cookie,請瀏覽到該站點並單擊頂部的小掛鎖圖示。然後點選“Cookie”。

正在使用的Cookie

正在使用的Cookie

然後深入到該網站的資料夾。在下面的示例中,您可以看到我們設定了一些WooCommerce cookie以及 wordpress_logged_in_[hash]cookie。您還可以檢視過期時間以及它是持久cookie還是會話cookie(瀏覽會話結束時)。

WordPress cookie

WordPress cookie

要刪除cookie,只需單擊單個cookie並單擊“刪除”按鈕。您也可以在資料夾級別或Chrome DevTools中執行此操作。

清除cookie還可以幫助您修復304錯誤

或者,您可以在瀏覽器中搜尋或清除所有cookie

GDPR和Cookie

GDPR是一項新的隱私法,於2018年5月25日生效。它旨在讓公民重新控制他們的個人資料。

下面是一個為幫助遵守新法律所做的一項更改的示例。當您第一次訪問我們的網站時,您可能已經看過它,您會在螢幕底部看到“ACCEPT Cookies”提示。這是因為我們現在被法律要求為使用者提供一種選擇加入和選擇退出設定的cookie的方式。在不通知使用者資料收集的情況下只執行您想要的任何東西的日子已經一去不復返了。

GDPR和Cookie

如果您單擊“ACCEPT Cookie”,則會為使用者設定所有Cookie。如果您單擊“Cookie Setting”,我們現在會提供一種方式來選擇加入和退出您想要的任何Cookie。

Cookie設定

Cookie設定

很漂亮吧?我們的cookie解決方案是由我們的開發人員內部構建的,但這裡有一些有用的GDPR WordPress外掛,可以幫助您完成類似的事情。同樣,Cookie只是完全符合 GDPR 的一小部分。

PHP會話

PHP會話是標準cookie方法的替代方案。它仍然是一個cookie,但它被稱為PHPSESSID,通常儲存在Web伺服器本身的/tmp/目錄中。伺服器知道將給定會話與給定請求相關聯的方式是它也儲存在HTTP cookie中。

PHPSESSID HTTP cookie

PHPSESSID HTTP cookie

這也可以在站點的HTTP標頭下看到。

HTTP標頭設定cookie PHPSESSID

HTTP標頭設定cookie PHPSESSID

PHP session很像一個普通的session,它在使用者關閉瀏覽器時結束。

PHP會話的問題都歸結為效能和快取問題。儲存在瀏覽器cookie中的資訊必須隨著每個請求來回反彈,以便伺服器知道使用者是誰。這意味著對於使用PHPSESSID的站點,主機必須設定PHPSESSID以繞過快取。然而,結果是PHPSESSID必須設定為100%的時間繞過,因為與 wordpress_logged_in不同的是,PHPSESSID是在每個PHP請求上設定的。

所以想象一下,wordpress_logged_in必須設定100%的時間才能允許登入功能正常工作。這意味著即使是登出的使用者也必須擁有cookie,並且它必須對他們來說是唯一的。想象一下,為了使WordPress登入系統正常工作,這是必需的。在這種情況下,每個頁面檢視都必須繞過快取,以便wordpress_logged_in為登入和登出的使用者正確設定cookie。

這就是使用PHPSESSID的問題。因為它是在每一個PHP請求上生成的,所以如果一個站點依賴於PHPSESSID cookie,主機將不得不設定PHPSESSID以100%的時間繞過快取。否則,PHPSESSID最終會被快取,並且會破壞依賴它的任何功能。

我們不建議使用PHP會話,PHP會話還具有其他應考慮的安全隱患。

如果您在您的網站上看到程式碼使用session_start,這意味著它使用PHP會話。

許多外掛和主題開發人員已經開始使用瀏覽器cookie和資料庫行的組合(在wp_options表中或他們自己的自定義表中)。如果您需要會話資料,這是更好的方法。

小結

希望現在您比以前更瞭解WordPress cookie和PHP會話的工作原理。Cookies目前是讓世界運轉的東西,對於WordPress網站上發生的幾乎所有事情都很重要。從讓我們保持登入狀態,到確保順暢的購物車體驗,甚至確保彈出視窗保持關閉狀態。

評論留言