最新消息:蔓草札记的微信公众号开通了,赶紧在微信通讯录公众号中搜索“蔓草札记”关注下吧 :)

用SAE托管WordPress网站Feed地址

博客经验 xhhjin 1616浏览 0评论

现在FeedSky已经完全不行了,托管的Feed地址也没办法访问,之前写《Feed托管服务商的选择与使用技巧》和《WordPress Feed美化及订阅统计》时,虽然不是很稳定,但凑合着可以用。就现在的状况来看,是时候把自定义的Feed域名换个地方托管了,并且通过SAE高级开发者后,每月送的云豆也用不完,就琢磨着把Feed域名解析到SAE上。

用SAE托管WordPress网站Feed地址

在《Feed托管服务商的选择与使用技巧》中,已经介绍过在自己空间通过子域名托管自定义域名的方法,很简单的几步。首先在主机上添加一个子域名,作为Feed订阅地址,如:feed.xuhehuan.com;然后再空间上建立一个名为index.php的文件,内容如下:

<?php
header("Content-Type: application/xml; charset=utf-8") ;
@readfile(http://xuhehuan.com/feed);
?>

在SAE中,@readfile是没办法使用了,不过有不少替代的方法,实现起来同样非常简单。首先在SAE的控制台中新建一个应用来托管Feed,然后绑定域名,最后新建一个index.php的文件放到应用的目录下,建立index.php的方法不止一种,下面是我试过的几个,可以选择一个根据情况修改使用,记得把里面的’http://xuhehuan.com/feed换成你的feed地址。

一、初级篇

方法一:使用SaeFetchurl(SAE专用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed"; 
$f = new SaeFetchurl();
$content = $f->fetch($url);
echo $content;
?>

方法二:使用file_get_contents(普通主机也适用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed";
$content= file_get_contents($url);
echo $content;
?>

方法三:使用curl(普通主机也适用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed";
$header[] = "Content-type: text/xml;"; //定义content-type为xml 
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//定义请求类型
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); //定义是否直接输出返回流
$content=curl_exec($ch);
if(curl_errno($ch)){ 
    echo curl_error($ch);
    curl_close($ch);
}
else {
    curl_close($ch);
    echo $content;
}
?>
二、进阶篇

如果你用的是原生的wordpress feed输出地址,上面的代码应该就可以应付了,但如果SAE抓取你主机的访问速度比较慢,很可能会出现feed输出内容没抓全的问题,以SaeFetchurl来说,就有这样的服务限制:

默认超时时间:

  • 连接超时: 5秒
  • 发送数据超时: 30秒
  • 接收数据超时: 40秒

这时就要根据情况增大抓取链接允许的超时限制了,为此以上三个方法可以分别修改为:

方法一:使用SaeFetchurl(SAE专用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed"; 
$f = new SaeFetchurl();
$f->setConnectTimeout(20000); //以毫秒为单位,必须小于SAE系统设置的时间,否则以SAE系统设置为准(默认为20秒)
$content = $f->fetch($url);
if ($content === false)
    var_dump($f->errno(), $f->errmsg());
else
    echo $content;
?>

方法二:使用file_get_contents(普通主机也适用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed";
$opts = array(
    'http'=>array(
        'method'=>"GET",
        'timeout'=>20, //以秒为单位
    )
);
$context = stream_context_create($opts); 
$content= file_get_contents($url, false, $context);
echo $content;
?>

方法三:使用curl(普通主机也适用)

<?php
header("Content-Type: text/xml; charset=utf-8") ;
$url="http://xuhehuan.com/feed";
$header[] = "Content-type: text/xml;"; 
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20000); //以毫秒为单位,在发起连接前等待的时间,如果设置为0,则无限等待
$content=curl_exec($ch);
if(curl_errno($ch)){ 
    echo curl_error($ch);
    curl_close($ch);
}
else {
    curl_close($ch);
    echo $content;
}
?>

这样基本解决了抓取显示的问题,就是查看时可能需要多等待些时间。

三、进阶篇

接下来进行更深一步的优化,用SAE的cron服务将需要抓取的url事先生成好放到storage或kvdb中,从而节省抓取时间,加快访问速度。这里仅以SAE应用为例,其它情况请自行参考。为此,首先在config.yaml文件中增加下面几句:

cron:
- description: curl feed xml file
  url: /feed.php
  schedule: every day of month 03:00

然后在根目录新建feed.php,实现抓取网站feed的url生成xml文件到storage中(当然用kvdb也行),这样每天凌3点都会更新网站的xml文件到SAE应用下面,由于这个feed.php不是直接展示给用户的,因此不用在意等待时间,只需保证xml文件生成正确就行。feed.php内容如下,请根据情况修改备份域和抓取的feed地址:

<?php
/*********************************************************************************
**** 为网站的Feed生成xml文件并存储到storage下(By xhhjin: http://xuhehuan.com) ****
*********************************************************************************/
define('DB_DOMAIN','cdn');		//备份域
$url='http://xuhehuan.com/feed';	//抓取的feed地址
$pathname = 'feed/rss.xml';		//存储的feed文件

header('Content-Type: text/xml; charset=UTF-8');
$opts = array(
    'http'=>array(
        'method'=>"GET",
        'timeout'=>20, //以秒为单位
    )
);
$context = stream_context_create($opts); 
$cnt=0;  
while($cnt<5 && ($content=file_get_contents($url, false, stream_context_create($opts)))===FALSE) $cnt++;   
$stor = new SaeStorage();
$stor->write(DB_DOMAIN, $pathname, $content);	
echo $content;
?>

这里通过增加连接等待时间和失败时多次重试的方法来尽量保证网站feed对应xml文件生成的正确性。最后一步就是修改网站根目录的index.php文件了,让它直接读取SAE上的xml文件显示,不用再次访问网站feed。修改如下:

<?php
header("Content-Type: text/xml; charset=utf-8") ;
header('Pragma: no-cache'); //兼容HTTP/1.0和https
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$url="http://mancao-feed.stor.sinaapp.com/feed/rss.xml";	//替换为你的正确的地址
$content= file_get_contents($url);
echo $content;
?>

教程结束,再次访问下自定义的feed域名地址,感觉好很多了吧 :)

后记,后面使用时发现,有时访问会出现XML访问不全或Chrome下访问出现空白的问题,目前还没有找到办法解决。


欢迎转载,转载请注明出处:蔓草札记 » 用SAE托管WordPress网站Feed地址

♥ 喜欢 0 赞赏
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址