这种针对缓存和Cookie的解决方案会给我带来麻烦吗?


23

我已经提出了一个临时解决方案,该解决方案不是很常见,但与流行的WP缓存解决方案与cookie(在这种情况下为标准WP注释cookie)的交互作用相比,还没有出现前所未有的问题。我的解决方案还涉及在提供缓存文件方面很少定义的“已知用户”例外。无论它是否可用,我都认为对它进行解释并可能了解为什么它不是一个好主意通常具有指导意义。

我已经使用WP Super Cache,W3 Total Cache和Comet Cache测试了我的方法。在研究此问题时,我为自己详细介绍的一个就是WP Super Cache(以下简称“ WPSC”),因此我将其作为主要示例。

背景

如果将WP标准评论线程设置为允许访问者发表评论,则将为非注册用户并登录的任何评论者设置评论cookie,并使用实际的评论特权进行进一步检查。在我认为是最常见的配置中,评论者只需提供姓名和电子邮件地址。它们存储在两个浏览器Cookie中,通常是comment_author_ . COOKIEHASHcomment_author_email_ . COOKIEHASHCOOKIEHASH是根据用户选项定义的。

如果设置为将新生成的文件传递给“已知用户”,则WPSC会基于以下检查来确定是否提供缓存文件:登录的用户会获得新文件,访问者“可以发表评论”也是如此。后者主要由comment_author_cookie 在浏览器中的存在来标识,这些cookie不是由特定用户COOKIEHASH(通常但并非总是记录在站点选项中的“ siteurl”的MD5编码版本)为特定用户而唯一或唯一标识的。

来自wp-cache-phase1.php LL371-383的WPSC代码的关键部分似乎使用RegEx模式来获取字符串,并在cookie中循环:

$regex = "/^wp-postpass|^comment_author_";
if ( defined( 'LOGGED_IN_COOKIE' ) )
    $regex .= "|^" . preg_quote( constant( 'LOGGED_IN_COOKIE' ) );
else
    $regex .= "|^wordpress_logged_in_";
$regex .= "/";
while ($key = key($_COOKIE)) {
    if ( preg_match( $regex, $key ) ) {
        wp_cache_debug( "wp_cache_get_cookies_values: $regex Cookie detected: $key", 5 );
        $string .= $_COOKIE[ $key ] . ",";
    }
    next($_COOKIE);
}

现在,如果我严格使用PHP,可以重新生成或挂钩WP核心功能,并comment_author_ . COOKIEHASH通过注释模板获得常规设置,但是我正在使用jQuery Cookie插件在jQuery中工作。但是,如您所见,如果您查看RegEx,则WPSC函数并不在乎COOKIEHASH:如果遇到,它会感到满意comment_author_

我的解决方案

$.cookie( 'comment_author_proxyhash', 'proxy_author', { path: '/' } );

对于那些不熟悉jQuery Cookie的用户:上面的代码使用key = comment_author_proxyhash和value = 设置了一个简单的会话cookie,proxy_author对整个站点都很有用。(此外,对于那些谁使用jQuery Cookie和WP,除了预代替熟悉的jQuery $的WP jQuery,我也已经设置$.cookie.raw = true;。)

我在jQuery脚本中添加了这一行,瞧!,WPSC,W3 Total Cache和Comet Cache的行为均与我希望的一样。使用脚本并重新加载后,我得到了新的页面。如果我碰巧提出了一个真实的评论,那么就设置了normal comment_author_comment_author_email_cookie,并且共存似乎没有任何问题。

可能的一个缺陷是,只要用户保持会话打开,“ proxyhash” cookie就会随用户一起旅行,但这并不会给我带来重大问题-甚至不值得警告。我当然从未听说过有人抱怨其中一种常规Cookie发生这种事情。

但是也许有些东西我不见了,如果对我的教育也有潜在的帮助,我会发现很多事情。或者,也许有一种相对简单的最佳实践方法可以让我COOKIEHASH在jQuery中复制,也涵盖替代用例...,或者通过其他方式达到相同的最终效果-其他诱骗缓存插件来对待访问者的其他方式作为评论者...

如果不是,是否有充分的理由不将其或其附近的东西通过插件插入宇宙?


3
为一个经过充分研究和记录的问题提供支持。但是,我觉得这个问题的性质可能会使它更多地用于讨论,而不是一个明确的答案(离题:主要基于观点)。我认为FWIW在这里没有任何问题-最终,您只是设置了一个没有个人数据的通用Cookie。
TheDeadMedic '16

非常感谢您的投入。对于上述讨论,我将不胜感激,并将以下任何一项都标记为好答案:a)指出了这种“通用cookie”方法的问题,b)提供了达到相同效果的替代方法,或c)提供了有用的方法深入了解与“已知用户”相关的基本技术问题。
CK MacLeod

请注意,您可以使用wp_localize_script将cookie哈希传递给Javascript,以便可以使用“本机” cookie代替proxyhash。否则,这是一个非常有趣的问题,并且您的解决方案似乎很可靠,尽管cookie +缓存总是非常复杂,很难说这是“正确的”解决方案还是遗漏了什么。伟大的研究!
phatskat

有趣的问题-我对此一无所知,这会给您带来麻烦,但是我能问您为什么要以这种方式绕过缓存吗?为用户提供这种能力有点打败了拥有整个页面缓存的目的。此外,当可以通过简单地将任何查询参数附加到URL(例如mysite.com?a)来使用通用缓存配置实现相同的结果时,额外的cookie会增加请求的大小(尽管最小)。只是我的$ 0.02 ...
ssnepenthe

ssnepenthe:也许我应该解释:一个插件,当我写的问题,我开发- wordpress.org/plugins/commenter-ignore-button “上忽略” -用了jQuery让游客把选择的评议 初始操作将CSS格式应用于注释线程,然后依靠cookie存储该名称及其存在,以在随后的刷新中复制效果(通过PHP)直到cookie到期。在页面的缓存版本中,效果不会被注册。因此,是的,这是一种有意本地化的缓存清除形式。
CK MacLeod

Answers:


1

您的带有comment_author_proxyhash cookie的解决方案在技术上当然可以正常工作-我知道的所有缓存插件都不会分析哈希值,并且只会基于comment_author_ * cookie的存在停止传送缓存的内容。

这里的问题是页面缓存功能是网站真正需要的功能,而页面缓存的配置恰恰是因为裸露的WordPress性能不足,甚至在高峰时段甚至使服务器崩溃。这取决于网站内容的性质,但网站所有者有时无法支付通过PHP / WP代码处理所有内容所需的硬件。换句话说,只要有可能,就必须从页面缓存中提供尽可能多的流量。从实践中,我可能会告诉我们,我们经常必须识别和禁用执行缓存异常的插件。

当然,这并非总是可能的,但是请尽可能尝试使用缓存的页面。例如,您可以div通过javascript 隐藏带有您要忽略的注释的标签,或者对整个注释块进行ajax-ify。

无论如何,您都不需要将访问者标记为评论者,但是由于您的自定义逻辑原因,请停止缓存。因此,最好使用唯一的cookie并使其成为缓存异常信号。W3 Total Cache为此提供了“拒绝cookie”选项,但列表中没有其他插件,因此您将需要像建议的那样进行黑客入侵。


谢谢!您提出了许多有效的问题,但我要说的是,这段代码的本质是将参与注释线程的所有访问者视为足以将某人“忽略”或“静音”的访问者视为“已知用户/评论员。” 如果网站无法处理此类参与,那么它也可能无法处理标准的WordPress评论模板(和评论社区)!
CK MacLeod

认为您就在这里,但是当然不能肯定您的用户如何使用它。顺便说一下,许多高流量网站正将其评论处理工作分流到单独的请求甚至第三方服务,目的是为了快速显示文章内容,并在以后延迟加载动态评论内容。将其作为可能的插件进一步版本的
错题
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.