2010-06-16 50 views
0

我正在使用簡單的php生成的推文箱,用戶時間線推文從user_timeline rss提要中拉出,並緩存到本地文件以減少負載,並作爲當Twitter停止時備份。我基於這個緩存:http://snipplr.com/view/8156/twitter-cache/。這一切似乎昨天運作良好,但今天我發現緩存文件是空白的。刪除它然後再次加載生成一個新的文件。爲Twitter rss提要生成緩存文件

我使用的代碼如下。我已經編輯它,試圖讓它與我已經用來顯示Feed的工作一起工作,並可能弄糟了一些關鍵的東西。

我所做的更改如下(我堅信任何這些都可能是原因): - 修改時差代碼(鏈接的示例似乎使用未包含在自定義函數中的自定義函數代碼)

  • 從「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沒有人可以幫助...?

我認爲它有一個關於空白緩存文件寫在一個很好的嘰嘰喳喳宕機時,因爲否則我想象這應該發生的每隔十分鐘時,緩存文件重寫,但它並不經常發生。

我做了如下改變,它檢查該文件是多大覆蓋它的一部分:

$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); 
} 

...所以現在,只會寫的文件,如果它是經過10分鐘的老有從rss頁面檢索到的實際內容。你認爲這會起作用嗎?

回答

0

是的,你的代碼是有問題的,因爲無論Twitter發送給你什麼,你都會寫。 您應該測試你從Twitter獲得類似這樣的文件:

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

file_get_contents()函數返回false,如果有錯誤,緩存一些新的內容之前檢查它。

+0

完美,非常感謝!我剛發現我也需要包裝file_get_contents(因爲它創建的錯誤 - 最終看到它實際發生)。 我可以這樣問:在原來的代碼中,我從$ fetch函數中將$ cache_rss序列化,然後再進行反序列化。我已經取消了序列化,因爲我不知道如何以與其他代碼一起工作的方式將其反序列化。你是否看到任何它應該被序列化的原因或任何可能導致它沒有被序列化的問題? – Kerri 2010-06-17 23:25:07

+0

我真的不明白爲什麼你必須序列化rss輸出。它是一個字符串和一個字符串,它是一個簡單的類型。但我不太瞭解序列化:) – analogue 2010-06-18 00:06:02