突然发现,我最近写的几篇文章都没有被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
[FeedValidator][]和[W3C的feed检查工具](http://validator.w3.org/feed/)(似乎W3C使用的是[FeedValidator][]的开源程序,可以在[这里下载](http://www.feedvalidator.org/docs/howto/install_and_run.html),同时在sf.net上也[登记了](http://sourceforge.net/projects/feedvalidator/),不过没在上面发布文件),都会返回超时错误:
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](http://markjaquith.wordpress.com/2007/01/06/wordpress-206-feedburner-issue-and-fix/)
- [WordPress 2.0.6 中的 Feedburner bug](http://blog.serv.idv.tw/2007/01/08/591/)
- [升级 WordPress 2.0.5 到 2.0.6 的步骤](http://bemike.org/blog/2007/01/07/upgrading-wodpress-from-205-to-206.html)
- [WordPress 2.0.6 Feedburner Bug 及修复](http://blog.istef.info/2007/01/07/wordpress-206-feedburner-bug-and-fix/)
不过我现在用的版本是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:\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"
这说明[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秒就超时啊,怪不得我不适应,被铁通蹂躏惯了。。。
顺便推荐一个不错的在线工具:
- [View HTTP Request and Response Header](http://web-sniffer.net/?url=&submit=Submit&http=1.1&type=GET&ua=FeedBurner%2F1.0+%28http%3A%2F%2Fwww.FeedBurner.com%29)