FeedBurner不认我的Feed了

突然发现,我最近写的几篇文章都没有被rss阅读器收录,以致于我也无法用email转发到其他镜像上去,本来以为是FeedBurner等网站访问国内受阻,今天无意中使用FeedValidator检查才发现,无法访问我的feed!同时,GoogleReader也无法访问,看来真的是出问题了。

FeedBurner的错误提示为:

There is an issue that must be addressed with your source feed for the feed "Fwolf's Blog"

Read timed out

FeedValidatorW3C的feed检查工具(似乎W3C使用的是FeedValidator的开源程序,可以在这里下载,同时在sf.net上也登记了,不过没在上面发布文件),都会返回超时错误:

Server returned timed out

偶尔还会返回更离谱的错误信息:

Server returned (104, 'Connection reset by peer')

让我有一种自己的网站被封锁了的感觉(封锁是双向的,出国访问和从国外访问国内都受影响)。

GoogleReader的错误提示:

No feed available for "http://www.fwolf.com/blog/feed"

开始查找错误的原因,首先看看是不是被封锁了的原因,使用匿名web代理http://anonymouse.org/anonwww.html能够访问,从DreamHost主机上wget也能成功,排除被封锁了的可能。本来我写的内容也不应该会被封锁嘛,那是不是FeedBurner服务器的问题呢?有这个可能,但我没法实验去。

分别把AkismetSpam Karma 2等反spam插件停止,问题依旧,说明不是被anti spam程序阻止的问题。

是不是WordPress的问题呢?记得WP 2.0.6曾经和FeedBurner有过冲突,参见:

不过我现在用的版本是2.1.1,应该没有上述问题,不过还是排除一下的好,把WP升级到了最新的2.1.3版本,问题依旧,初步排除WP自身的问题。

是不是升级之后,.htaccess简化网址的配置文件出问题了?但是我分别用FeedValidatorFeedBurner检查RSS Feed的直接网址http://www.fwolf.com/blog/wp-rss2.php,依然都是超时错误,排除。

是不是php执行出了什么错误了呢?在php的errorlog文件中我发现了:

[04-May-2007 19:45:27] PHP Fatal error:  Maximum execution time of 90 seconds exceeded in D:\fwolf\wordpress\wp-content\plugins\markdown.php on line 1761

不过我直接用浏览器访问我的Feed是可以的,应该也不是php的问题,不然我的blog应该整个显示不正常才对。

继续探索,发现了更离奇的事情,在apache的access.log中我发现如下记录:

66.150.96.109 - - [04/May/2007:20:12:13 +0800] "GET /blog/feed/ HTTP/1.1" 200 24315 "-" "FeedBurner/1.0 (http://www.FeedBurner.com)"

208.97.167.25 - - [04/May/2007:20:14:14 +0800] "GET /blog/feed HTTP/1.0" 200 86896 "-" "Wget/1.9.1"

67.19.173.84 - - [04/May/2007:23:16:44 +0800] "GET /blog/feed/ HTTP/1.1" 200 24315 "-" "FeedValidator/1.3"

这说明FeedValidatorFeedBurner都确实访问到了我的服务器,可他们怎么还是会超时呢?从浏览器访问的时候,虽然不是很快,但也没有30秒、60秒那么长,应该不会超时的。不过为了确认一下,找了一篇文章的comment的feed:http://www.fwolf.com/blog/post/310/feed,结果就可以通过检查:

Congratulations!

[Valid RSS] This is a valid RSS feed.

会不会是没有返回文件大小的原因?在wget的时候会看到:

HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/xml]

FeedBurner只允许小于512k的feed,如果服务器不返回文件大小,FeedBurner就会中止操作?我试着返回一个伪装的文件长度,在wp-rss2.php中添加header("Content-Length: 10000");,这样用wget只能下载10k的内容,但是feed检查工具仍然报timed out错误。

无奈,只好给FeedBurner反馈意见,虽然是5.1休假期间,还是很快就收到了回信,大概说仍然是网站响应速度太慢了的问题(我从其他搜索得知限制大概是10秒以内),除了提升响应速度之外,暂时没有其他解决办法。

精疲力尽,忽然禁用Markdown Extra这个plugin之后,居然没问题了,看来还是响应时间的问题,Markdown Extra用到了太多的正则替换,加上最近写的几篇文章都不算太短,服务器响应略微慢了一些,加上中国到美国的数据传输时间,怪不得会超时呢。我也是疏忽了,上面的access.log和php的errorlog,都多少有些提示,但我没有注意到。

虽然定位了问题所在,但Markdown Extra还是要用的,没了它我写文章的兴趣会减少一大半,好在WP可以调整RSS中输出的文章数量(Options->Reading->Show the most recent: ? posts),我试了一下,默认是返回10篇,不过会超时,调整到7篇的时候就不会超时了,为了保险起见还是设置为5好了。希望网上的抓FEED机器人不要太懒,免得把文章跳过去喽。

几点感受:

  1. 发现问题之后,要善于寻找原因,不能盲目瞎摸,有些问题不找到根源,重试一万遍也不会改变,还是要一层一层的反复分析、排除。

  2. 如果在程序中要大量用到Markdown语法的话,为了提高速度,可以采用空间换时间的方法,除了保存原文之外,把解析的结果也存一份,这样访问速度快。

  3. 作开发的时候对速度考虑的优先级要提高,10秒就超时啊,怪不得我不适应,被铁通蹂躏惯了。。。

顺便推荐一个不错的在线工具:

Leave a Reply

Your email address will not be published. Required fields are marked *