【问题标题】:Generating cache file for Twitter rss feed为 Twitter RSS 提要生成缓存文件
【发布时间】:2010-06-18 07:07:45
【问题描述】:

我正在使用一个简单的 php 生成 twitter 框的网站工作,其中包含从 user_timeline rss 提要中提取的用户时间线推文,并缓存到本地文件以减少负载,并在 twitter 出现故障时作为备份。我基于此缓存:http://snipplr.com/view/8156/twitter-cache/。昨天似乎一切正常,但今天我发现缓存文件是空白的。删除它然后再次加载会生成一个新文件。

我正在使用的代码如下。我已经对其进行了编辑,试图让它与我已经用来显示提要的内容一起使用,并且可能弄乱了一些关键的东西。

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

  • 从“fwrites”中删除了“序列化”功能。这纯粹是因为一旦我将它加载到显示代码中,我就无法弄清楚如何反序列化。我真的不了解序列化所扮演的角色或它是如何工作的,所以我确定我应该保留它。如果是这种情况,我只需要了解在代码的第二部分中在哪里/如何反序列化所以它可以被解析。

  • 删除了 $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 页面检索到实际内容。你认为这会奏效吗?

【问题讨论】:

    标签: php caching twitter


    【解决方案1】:

    是的,您的代码有问题,因为无论 Twitter 发送给您什么,您都可以编写它。 您应该像这样测试从 Twitter 获得的文件:

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

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

    【讨论】:

    • 完美,非常感谢!我刚刚发现我也需要打包 file_get_contents(因为它产生的错误——终于看到它发生在现场)。我可以问一下:在我从中获取的原始代码中,$cache_rss 在 fwrite 函数中被序列化,然后稍后被取消序列化。我已经取消了序列化,因为我不知道以后如何以与其余代码一起使用的方式对其进行反序列化。您是否看到它应该被序列化的任何原因,或者它可能导致它没有被序列化的任何问题?
    • 我真的不明白为什么你必须序列化 rss 输出。它是一个字符串,作为一个字符串,它是一个简单的类型。但我对序列化了解不多:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2017-11-22
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多