相关主题

动态触发的缓存更新机制异步化的可能性

FBO wordpress插件在搜集来自朋友的outline时采取的是和wordpress dashboard以及lilina类似的
动态触发的缓存更新机制,也就是每次有用户访问某些页面的时候触发搜集过程,搜集过程先在缓存中查找,如果有未过期缓存可用,就使用缓存,否则就做远程更新。这种做法解决了一些问题,但有着不可避免的缺陷,尤其是在页面请求之间形成loop的时候更加糟糕。
车东的一篇blog提到了如何改良这种缓存机制,他的方法是在服务器端部署一个cron任务,定期触发更新缓存的链接。这样可以减少用户触发远程同步的几率,但是抬高了技术门槛,拿FBO wordpress插件来讲,如果要求每个用户都去服务器上加一个cron任务,几乎不太可能。
动态触发的缓存更新机制的问题是触发的过程和更新的过程必须同步的问题。是否能将请求的触发和缓存更新变成一个异步的过程,是解决这个问题的根本。我查了下php的资料,除了一个不推荐在webservice上启用的pcntl提供的fork以外,没有找到现成可用的异步机制。只有想其他的办法了。网页上的异步机制,最容易想到的就是ajax,想到这里,解决方案基本上就有了。
首先,将触发缓存更新的页面请求链接独立出来,比如说定义成http://www.example.com/update-cache,不提供任何的直接访问。在用户访问相关页面的时候,可以先强制使用缓存内容,同时,通过页面中的javascript调用xmlhttprequest向http://www.example.com/update-cache发出一个异步请求。由于是异步请求,页面的调入不会有延迟。对于这个异步请求,我们可以不提供任何callback处理。这个异步请求自动在后台启动缓存更新机制,因为没有人在线等待起结果,这个请求有多长的延迟也不会有影响。原本会造成延迟的同步请求就变成了后台的异步操作。
由于这个问题的存在,我暂时停止了FBO wordpress插件0.2版的下载。我会尝试用这个新办法,争取在下一版解决这个问题。不知道熟悉网站开发的朋友对这个问题有什么更好的建议?

6 条评论

五分钟为FBO wordpress插件制作一个365key的provider

Friends By Outline wordpress插件从v0.2起开始支持自定义内容扩展。缺省情况下,只能按照你的wordpress blog、del.icio.us和flickr的内容来生成一个outline。通过自定义内容扩展,可以很容易的导入其他内容。我把这种内容扩展叫做 provider。现在就以365key为例,看看怎么制作一个provider让你的FBO支持365key网摘。
首先,创建一个名字叫365key.php的文件。在这个文件里需要实现两个函数,一个提供一个配制信息,一个通过配制信息提取365key的内容,导入FBO。
配制信息函数类似wordpress中的配制页面函数,需要提供配制页面的内容和处理提交的信息。在这里,我们只需要得到用户的365key ID,那么这个函数就是这样的:

function b365key_option()
{
if (!empty($_POST['doSubmit'])) {
update_option(’fbo_365key_id’, $_POST['fbo_365key_id']);
}
?>
<p>
<label> My 365key ID:<br/>
<input type=”text” name=”fbo_365key_id”
value=”<?php echo get_option(’fbo_365key_id’); ?>” />
</label>
</p>
<?php
}

我 们有了365key的id,就可以通过”http://www.365key.com/rss/<id>”来访问网摘,并通 过wordpress自带的MagpieRSS函数提取这个内容,再创建一个OPMLItem对象,用一个attribute array来初始化这个对象(也可以使用这个对象的AddAttribute方法添加属性),最后把这个对象插入以函数参数形式传入的OPML对象中,并 返回这个对象就可以了。这个函数如下:

function b365key_provider($obj)
{
$b365key_id = get_option(’fbo_365key_id’);
if(!empty($b365key_id)) {
$rss = fetch_rss(’http://www.365key.com/rss/’.$b365key_id);
foreach($rss->items as $item)
{
$item_date=date(’Y-m-d H:i’,
strtotime($item['pubdate']));
$node = new OPMLItem(array(
‘title’=>htmlspecialchars($item['title'], ENT_COMPAT, ‘UTF-8′),
‘type’=>’link’,
‘dateCreate’=>$item_date,
’subject’=>$item['category'],
‘htmlURL’=>htmlspecialchars($item['link'], ENT_COMPAT, ‘UTF-8′)));
$obj->AddChild($node);
}
}
return $obj;
}

然后,我们需要分别注册这两个函数:

fbo_add_provider(’bookmark’, ‘b365key_provider’);
fbo_add_option(’bookmark’, ‘Bookmarks’, ‘b365key_option’);

fbo_add_provider 是用来注册内容提供函数的。第一个参数是内容的类别,这里是”bookmark”。第二个是函数名,这里是b365key_provider。 fbo_add_option是用来注册配制函数的。第一个也是内容的类别,第二个是在配制页面中显示出的title,第三个是函数名。
这样,就得到一个365key.php,也可以点击这里直接下载,将它另存为365key.php就可以了。
最后,只需要将这个php文件拷贝到FBO插件安装目录下的fbo/providers目录下就可以了(那个目录下应该已经至少有四个文件了)。
现在回到wordpress管理页面Option下的FBO页面,就可以看到:

添上365key ID,点击Update Options,你的outline中就会包含365key网摘了。是不是很容易啊。
我会抽时间写一个FBO spec的草稿,这样大家就知道填写outline内容时需要添那些属性了。目前可以参考已有的providers。

3 条评论

相关主题

Friends by Outline wordpress插件 v0.2

改进了一下Friends by Outline的wordpress插件,除了修正了一些bug以外,增加了两个功能:

  • 增加了一个把收集来的FBO信息以list方式显示的接口,你可以在blog sidebar上加一个非常酷的blogroll list了。在你的theme的sidebar部分加入

    <?php fbo_list_show(); ?>

    就可以得到一个这样的列表:

    点击三角箭头就可以展开相关内容,具体效果可以试试本页面中的FBO Blogroll

  • 对于没有提供fbo.opml的页面,可以探测rss,这样的outline中只会有blog,不会有bookmark、photo等等。

除了看得见的功能,最主要的是为这个插件本身实现了一个插件机制,自己outline中的内容都由一些providers来提供,provider都独立放在一个目录下,系统在生成fbo.opml时自动调用已有的providers,plug and play,扩展起来会非常容易。目前缺省的providers有del.icio.us、flickr、wordpress blog和wordpress blogroll四个,分别提供bookmark、photo、blog和friend部分的内容。如果你用的bookmark不是delicious,完全可以制作一个provider,只要放在fbo/provider目录下就可以将你的bookmark导入到fbo.opml里。以后我会更详细介绍如何通过制作provider来扩展FBO插件。
下载:
FBO wordpress plugin v0.2
安装:
把下载包展开后,将整个fbo目录拷贝到wp-content/plugins/下,然后在管理plugin页面active就可以了。

Update:由于缓存机制存在问题,暂停下载,详细说明和解决方案在此

8 条评论

Recent Posts:

Recent Comments:

Archive:

Tags:

Bookmarks:

My music:

About Me:

I am a software engineer in Beijing, China. I write code for work and for fun. I am interested in web technology, life hacking and console games. This blog is dumped from my left brain.
View Robin Lu's profile on LinkedIn

My Flickr:

    drawingAt Modern Sky Music FestivalIMG_0389IMG_0312urumqi panaramaIMG_9664

Friends: