2010-05-19 63 views
1

我使用的是以下幾點:Twitter的RSS源,[domdocument.load]:未能打開流:

<?php 
$doc = new DOMDocument(); 
$doc->load('http://twitter.com/statuses/user_timeline/XXXXXX.rss'); 
$arrFeeds = array(); 

foreach ($doc->getElementsByTagName('item') as $node) { 
    $itemRSS = array ( 
     'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
     'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 
     'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
     'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue 
    ); 
    array_push($arrFeeds, $itemRSS); 
} 

for($i=0;$i<=3;$i++) { 
    $tweet=substr($arrFeeds[$i]['title'],17); 
    $tweetDate=strtotime($arrFeeds[$i]['date']); 
    $newDate=date('G:ia l F Y ',$tweetDate); 
    if($i==0) { $b='style="border:none;"'; } 
    $tweetsBox.='<div class="tweetbox" ' . $b . '> 
    <div class="tweet"><p>' . $tweet . '</p> 
    <div class="tweetdate"><a href="http://twitter.com/XXXXXX">@' . $newDate .'</a></div> 
    </div> 
    </div>'; 
} 

return $tweetsBox; 
?> 

從給定的時間表返回4個最近的鳴叫(XXXXX是相關供稿)

這似乎很好地工作,但我最近一直在斷斷續續收到以下錯誤:

PHP錯誤調試 錯誤:DOM文檔::負載(http://twitter.com/statuses/user_timeline/XXXXXX.rss)[domdocument.load]:未能打開流:HTTP請求失敗! HTTP/1.1 502錯誤的網關

我讀過上面的代碼依賴於Twitter beign可用,我知道它有時相當繁忙。有沒有更好的方式接收twits,或者是否有任何形式的錯誤陷阱我可以做,只是爲了顯示「推文目前不可用...」信息而不是導致錯誤。我是usnig ModX CMS,因此任何解析錯誤會導致網站死亡,而不僅僅是輸出警告。

謝謝。

回答

0

我知道這是舊的,但我只是尋找一個幾乎相同的腳本抓相同的解決方案,以獲取Twitter的時間表。我最終這樣做了,儘管我沒能徹底地測試它。

我將twitter url定義爲一個變量($ feedURL),我也在$ doc_load中使用它。然後,我包裹一切,除了爲$ feedURL這個條件語句:

$feedURL = "http://twitter.com/statuses/user_timeline/XXXXXXXX.rss" 
$headers = @get_headers($feedURL); 
if (preg_match("/200/", $headers[0])){ 
    //the rest of you original code in here 
} 
else echo "Can't connect user-friendly message (or a fake tweet)"; 

所以,它只是檢查飼料的頁面的標題,如果其狀態是200(OK),那麼其餘腳本將執行。否則,它會回顯您選擇的信息。

(參考:http://www.phptalk.com/forum/topic/3940-how-to-check-if-an-external-url-is-valid-andor-get-file-size/


ETA:甚至更好,節省飼料的緩存版本(這也將確保你不要超過負荷的API限制):

<?php 
$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/75168146.rss'); 
    $cache_static = fopen($cache_file, 'wb'); 
    fwrite($cache_static, $cache_rss); 
    fclose($cache_static);  
} 
//End of caching 
?> 

然後在您的$doc->load($cache_file)語句中使用$ cache_file而不是實際的提要url。 (改編自:http://snipplr.com/view/8156/twitter-cache/)。