FeedBurner的错误提示为:
There is an issue that must be addressed with your source feed for the feed "Fwolf's Blog"
Read timed out
FeedValidator和 W3C的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服务器的问题呢?有这个可能,但我没法实验去。
分别把Akismet
、Spam Karma 2
等反spam插件停止,问题依旧,说明不是被anti spam程序阻止的问题。
是不是WordPress的问题呢?记得WP 2.0.6曾经和FeedBurner有过冲突,参见:
- WordPress 2.0.6: Feedburner issue, and fix
- WordPress 2.0.6 中的 Feedburner bug
- 升级 Wordpress 2.0.5 到 2.0.6 的步骤
- WordPress 2.0.6 Feedburner Bug 及修复
不过我现在用的版本是2.1.1,应该没有上述问题,不过还是排除一下的好,把WP升级到了最新的2.1.3版本,问题依旧,初步排除WP自身的问题。
是不是升级之后,.htaccess
简化网址的配置文件出问题了?但是我分别用FeedValidator和 FeedBurner检查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:fwolfwordpresswp-contentpluginsmarkdown.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"
这说明FeedValidator和 FeedBurner都确实访问到了我的服务器,可他们怎么还是会超时呢?从浏览器访问的时候,虽然不是很快,但也没有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机器人不要太懒,免得把文章跳过去喽。
几点感受:
-
发现问题之后,要善于寻找原因,不能盲目瞎摸,有些问题不找到根源,重试一万遍也不会改变,还是要一层一层的反复分析、排除。
-
如果在程序中要大量用到
Markdown
语法的话,为了提高速度,可以采用空间换时间的方法,除了保存原文之外,把解析的结果也存一份,这样访问速度快。 -
作开发的时候对速度考虑的重要性要提高,10秒就超时啊,怪不得我不适应,被铁通蹂躏惯了。。。
顺便推荐一个不错的在线工具:
Source:http://www.fwolf.com/blog/post/319