首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个会话的WordPress写缓存问题

多个会话的WordPress写缓存问题
EN

Stack Overflow用户
提问于 2010-04-20 09:38:32
回答 2查看 492关注 0票数 0

我正在用WordPress开发一个内容滴管自定义插件,这是我的客户要求我构建的。他说他想让它捕捉一个页面浏览事件,如果是一天中的正确时间(从上一篇文章开始的24小时),从一个资源文件中提取并输出另一篇文章。他还需要它来引发一个标志,并防止其他会话触发相同的代码片段。所以,升起某种标志说,“我正在发布该帖子,离开其他进程”,然后它创建该帖子并再次释放该标志。

然而,最奇怪的事情是,当多个会话通过页面视图访问站点时,会发生负载。它触发而不是一个帖子--它随机地发出1个、2个或3个额外的帖子,每个帖子都认为现在是发布的正确时间,因为它已经超过了最后一个帖子的时间24小时。因为它有点随机,所以我猜测问题是某种写缓存,在这种情况下,其他会话直到几微秒后才会看到提升的标志。

该插件通过简单地使用WordPress中的update_option() API写入wp_options表来提升“标志”。其他用户会话应该使用get_option()读取该值并查看标志,然后不运行创建post的代码,因为给定的会话已经在这样做了。然后,完成后,我降低标志,其他会话照常继续。

但它所做的是让这些其他会话进入。

为此,我使用了add_action('loop_start','checkToAddContent')。关于这个函数的奇怪之处在于,它在一个页面上被多次调用,实际上一些插件可能会调用它。我不知道有没有更好的活动。尽管如此,即使我找到一个在页面视图上只运行一次的事件,我仍然有多个会话要处理(可能同时查看页面的不同用户),并且我希望只有一个给定的会话在post按计划到期时触发内容发布。

我想知道是否有任何WordPress插件开发人员可以提出另一个事件钩子来抓住,并想出另一种方法来提高所有会话都能看到的标志。我的意思是,我可以在PHP中使用共享内存API,但许多托管计划都禁用了它。不能使用cookie或会话变量,因为这只是一个会话。大概唯一一件可以跨主机计划工作的事情就是丢弃一个文件作为标志。如果该文件存在,则一个会话具有该标志。如果该文件不存在,则其他会话可以尝试获取该标志。当然,我可以使用文件路径,但在我看来它有点不成熟,我想知道在WordPress中是否有什么我可以做的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-21 12:43:39

即使是来自同一个会话(同一个访问者)的页面请求也会出现这样的问题,但来自不同访问者的页面请求也会出现这种情况。它是这样工作的:

  • 如果你正在做内容滴漏,那么页面请求可能就是你用add_action('wp','myPageRequest')截取的内容。从那里开始,如果一个预定的帖子到期了,你就创建一个新的帖子。
  • 这个帖子需要一点时间来写入数据库。在此期间,get_posts()上的查询可能还看不到新记录。它实际上可能会触发您的代码,在已经发布帖子的情况下创建一个新帖子。

修复方法是强制WordPress刷新写缓存,如下所示:

代码语言:javascript
复制
try {
  $asPosts = array();
  $asPosts = @ wp_get_recent_posts(1);
  foreach($asPosts as $asPost) {break;}
  @ delete_post_meta($asPost['ID'], '_thwart');
  @ add_post_meta($asPost['ID'], '_thwart', '' . date('Y-m-d H:i:s'));
} catch (Exception $e) {}
$asPosts = array();
$asPosts = @ wp_get_recent_posts(1);
foreach($asPosts as $asPost) {break;}   
$sLastPostDate = '';
@ $sLastPostDate = $asPost['post_date'];
$sLastPostDate = substr($sLastPostDate, 0, strpos($sLastPostDate, ' '));
$sNow = date('Y-m-d H:i:s');
$sNow = substr($sNow, 0, strpos($sNow, ' '));
if ($sLastPostDate != $sNow) {
  // No post today, so go ahead and post your new blog post.
  // Place that code here.
}

我们要做的第一件事就是获取最新的帖子。但我们并不关心它是否是最新的帖子。我们只需要获得一个帖子ID,然后添加一个隐藏的自定义字段(因此它以下划线开头),名为

_thwart

在...as中,通过将一些不太占用CPU的数据发送到数据库来阻止写缓存。

一旦完成,我们就再一次使用wp_get_recent_posts(1),这样我们就可以知道最近的帖子是否不是今天的日期。如果不是,那么我们就可以添加一些内容了。(或者,如果你只想每72小时滴入一次,等等,你可以在这里稍微修改一下。)

票数 0
EN

Stack Overflow用户

发布于 2010-04-21 13:25:13

关键字可以是在数据库中为"drip“事件创建信号量记录。

警告-考虑以下伪代码-我不会查找函数。

查询post时,请使用如下SQL语句

代码语言:javascript
复制
$ts = get_time_now(); // or whatever the function is
$sid = session_id();

INSERT INTO table (postcategory, timestamp, sessionid)
VALUES ("$category", $ts, "$sid")
WHERE NOT EXISTS (SELECT 1 FROM table WHERE postcategory = "$category"
    AND timestamp < $ts - 24 hours)

数据库完整性将使此成为原子,因此只能插入一条记录。并且只有在超过时间跨度的情况下才会发生插入。

然后立即检查当前的session_id()和时间戳是否属于您。如果是,就滴水。

从表中选择会话AND,其中postcategory = "$postcategory“,timestamp = $ts,sessionid = "$sid”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2672007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档