2010-08-13 63 views
1

在我最近的項目中,我使用了多個rss提要。我只想列出所有人的最新帖子,並按時間戳排序。帶PHP的多個RSS源(性能)

我的問題是,我有大約20個不同的飼料和頁面需要6秒加載(只測試10飼料)。

我該怎麼做才能使的通透性更好

我使用的SimpleXML:

simplexml_load_file($url); 

我追加到一個數組:我是做

function appendToArray($key, $value){ 
$this->array[$key] = $value; 
} 

就顯示之前krsort:

krsort($this->array); 

我應該緩存它不知何故?

回答

0

你有沒有做過任何調試?在代碼中的各個點記錄microtime

你會發現它是加載RSS提要,而不是解析它,需要花費時間,但你可能會發現這是由於每個RSS提要需要生成的時間。

將這十個提要保存爲靜態xml文件,將腳本指向它們並查看加載速度。

+0

這正是我的想法,但後來我需要一些cronscript加載每隔30秒保存xml文件。重點是我將向用戶顯示添加的最新條目。 – Jafu 2010-08-13 08:40:56

+0

有時您必須作出讓步以適應可用資源 – 2010-08-13 08:44:52

+0

感謝您的意見。我將使用靜態xml文件。 – Jafu 2010-08-13 09:02:46

2

您可以緩存它們,但是如果緩存過期,您仍然會遇到頁面加載時間過長的問題。

您可以在後臺運行PHP腳本(例如通過cron作業)並定期將您訂閱的訂閱源下載到數據庫中,然後在需要時可以更快地獲取/過濾數據顯示它。

+0

這似乎是最好的主意,也看到我的評論亞當在他的答案:)但仍然感謝! – Jafu 2010-08-13 08:44:06

0

您可以與curl_multi並行加載RSS源。這可能會加速你的腳本,特別是如果你現在使用阻止呼叫。

一個小例子(從http://www.rustyrazorblade.com/2008/02/curl_multi_exec/):

$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://www.rustyrazorblade.com'); 
$node_count = count($nodes); 

$curl_arr = array(); 
$master = curl_multi_init(); 

for($i = 0; $i < $node_count; $i++) 
{ 
    $url =$nodes[$i]; 
    $curl_arr[$i] = curl_init($url); 
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); 
    curl_multi_add_handle($master, $curl_arr[$i]); 
} 

do { 
    curl_multi_exec($master,$running); 
} while($running > 0); 

echo "results: "; 
for($i = 0; $i < $node_count; $i++) 
{ 
    $results = curl_multi_getcontent ($curl_arr[$i] ); 
    echo($i . "\n" . $results . "\n"); 
} 
echo 'done'; 

更多信息可以在Asynchronous/parallel HTTP requests using PHP multi_curlHow to use curl_multi() without blocking中找到(主要)。

順便說一句當使用curl_multi加載它們之後,你將不得不使用simplexml_load_string而不是simplexml_load_file。

+0

好點,但你不覺得保存文件會更好嗎? – Jafu 2010-08-13 09:08:10

+0

如果你緩存它們,那麼你偶爾會遇到緩存未命中的情況,如果你沒有緩存,那麼你的腳本將永遠打到遠程服務器上(並且你總是會有一個小的延遲)。就我個人而言,我會並行提取並緩存它們(這取決於更新提要的頻率和網站的用戶數量,只是看看對您有用)。如果需要的話,緩存期也可能會因爲每種飼料而有所不同(例如,如果您知道某些飼料有其他更多的定期更新)。 – wimvds 2010-08-13 09:15:19

+0

順便說一句,緩存本身並不能解決你的問題,正如@Tom Haigh已經指出的那樣。 – wimvds 2010-08-13 09:16:55

0

當然,緩存是唯一明智的解決方案。
更好地設置一個cron作業來檢索這些提要並在本地存儲數據。