为Twitter rss feed生成缓存文件

时间:2010-06-16 18:53:31

标签: php caching twitter

我正在使用一个简单的php生成的Twitter框进行工作,其中包含从user_timeline rss feed中提取的用户时间线推文,并缓存到本地文件以减少负载,并作为twitter关闭时的备份。我基于此缓存:http://snipplr.com/view/8156/twitter-cache/。这一切似乎昨天都运行良好,但今天我发现缓存文件是空白的。删除然后重新加载会生成一个新文件。

我正在使用的代码如下。我已经对它进行了编辑,试图让它与我用来显示Feed的内容一起工作,并且可能搞砸了一些重要的东西。

我所做的更改如下(我坚信其中任何一个都可能是原因): - 修改了时差代码(链接的示例似乎使用了未包含在代码中的自定义函数)

  • 从“fwrites”中删除了“serialize”函数。这纯粹是因为我在显示代码中加载后无法弄清楚如何反序列化。我实际上不理解序列化所扮演的角色或它是如何工作的,所以我确定我应该保留它。如果是这种情况,我只需要了解代码的第二部分在何处/如何反序列化所以它可以被解析。

  • 删除了$ rss变量,转而使用原始推文显示代码加载缓存文件。

所以,这是我使用的代码的相关部分:

<?php
$feedURL = "http://twitter.com/statuses/user_timeline/#######.rss";

// START CACHING
$cache_file = dirname(__FILE__).'/cache/twitter_cache.rss';
    // Start with the cache 
if(file_exists($cache_file)){
 $mtime = (strtotime("now") - filemtime($cache_file));
 if($mtime > 600) {
  $cache_rss = file_get_contents('http://twitter.com/statuses/user_timeline/75168146.rss');
  $cache_static = fopen($cache_file, 'wb');
  fwrite($cache_static, $cache_rss);
  fclose($cache_static);  
 }
 echo "<!-- twitter cache generated ".date('Y-m-d h:i:s', filemtime($cache_file))." -->";
}
else {
 $cache_rss = file_get_contents('http://twitter.com/statuses/user_timeline/#######.rss');
 $cache_static = fopen($cache_file, 'wb');
 fwrite($cache_static, $cache_rss);
 fclose($cache_static);
}
//END CACHING

//START DISPLAY
   $doc = new DOMDocument();
 $doc->load($cache_file);
 $arrFeeds = array();
 foreach ($doc->getElementsByTagName('item') as $node) {
     $itemRSS = array ( 
         'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
         'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
         );
     array_push($arrFeeds, $itemRSS);
    }
 // the rest of the formatting and display code....
 }
?>

ETA 6/17没人能帮忙......?

我认为这与在twitter关闭时在空白缓存文件上编写空白缓存文件有关,因为否则我认为这应该在缓存文件再次被覆盖时每十分钟发生一次,但它不会经常发生这种情况。

我对检查文件覆盖年限的部分进行了以下更改:

 $cache_rss = file_get_contents('http://twitter.com/statuses/user_timeline/75168146.rss');
 if($mtime > 600 && $cache_rss != ''){
   $cache_static = fopen($cache_file, 'wb');
   fwrite($cache_static, $cache_rss);
   fclose($cache_static);  
 }

...现在,它只会写文件,如果它超过十分钟,那么从rss页面检索到的实际内容。你觉得这会起作用吗?

1 个答案:

答案 0 :(得分:0)

是的,您的代码存在问题,因为无论Twitter发送给您什么,您都可以编写代码。 您应该测试从Twitter获得的文件,如下所示:

if (($mtime > 600) && ($cache_rss = file_get_contents($feedURL)))
{
  file_put_contents($cache_rss);
}

file_get_contents()如果有错误则返回false,在缓存一些新内容之前检查它。