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网站上发生的几乎所有事情都很重要。从让我们保持登录状态,到确保顺畅的购物车体验,甚至确保弹出窗口保持关闭状态。

本文提到: