我正在用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中是否有什么我可以做的。
发布于 2010-04-21 12:43:39
即使是来自同一个会话(同一个访问者)的页面请求也会出现这样的问题,但来自不同访问者的页面请求也会出现这种情况。它是这样工作的:
修复方法是强制WordPress刷新写缓存,如下所示:
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小时滴入一次,等等,你可以在这里稍微修改一下。)
发布于 2010-04-21 13:25:13
关键字可以是在数据库中为"drip“事件创建信号量记录。
警告-考虑以下伪代码-我不会查找函数。
查询post时,请使用如下SQL语句
$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”
https://stackoverflow.com/questions/2672007
复制相似问题