2010-10-19 182 views
1

我需要從大約500個URL中彙總RSS內容,而我試圖從這些URL的超時/內存耗盡錯誤(我嘗試使用SimplePie庫)中獲取內容。用PHP解析RSS源

是否有任何方法/想法從批量來源快速提取內容?

每次如何獲取新鮮內容?

<?php 
require_once('include/simplepie.inc');  
$urlList = array('http://site1.com/index.rss', 
'http://site1.com/index.rss', 
'http://site2.com/index.rss', 
'http://site3.com/index.rss', 
'http://site500.com/index.rss', 
); 
$feed = new SimplePie(); 
$feed->set_feed_url($urlList); 
$feed->init(); 
$feed->handle_content_type(); 
?> 

HTML部分

<?php 
foreach($feed->get_items() as $item): 
?> 
<div class="item"> 
<h2><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a></h2> 
<p><?php echo $item->get_description(); ?></p> 
<p><small>Posted on <?php echo $item->get_date('j F Y | g:i a'); ?></small></p> 
</div> 
<?php endforeach; ?> 
+1

向我們展示您的代碼,您可能會通過在其中保留上下文來填滿您的記憶。 – RobertPitt 2010-10-19 11:55:54

回答

2

我認爲你做錯了。如果你想解析那麼多的提要,你不能從一個將通過網絡服務器調用的腳本來完成。

如果你真的想要進行輪詢,你必須運行腳本,通過說,cron然後'保存'結果由另一個PHP腳本(可以由HTTP服務器調用)提供服務。

但是,你仍然必須處理很多固有的輪詢限制:99%的時間,你將沒有新的內容,因此浪費你的CPU,帶寬和你正在輪詢的服務器。您還將必須處理死飼料,無效飼料,限速等...

實施PubSubHubbub協議。這將有助於已經實施它的供稿,這樣您就只需等待將推送給您的數據。

對於其他提要,您可以自己進行輪詢,就像您一樣,並嘗試找到一種方法來避免單個錯誤(無效的XML,死主機...等)或真的在像Superfeedr這樣的服務上(我創建它)。

+0

這是正確的答案 - 腳本需要從命令行運行,否則它將始終(可能)達到最大執行時間。 – 2010-10-19 14:29:25

+0

感謝您使用cron完成的答案 – 2010-10-23 04:05:39

+0

不要忘記實現PubSubHubbub;它會讓你的生活變得更容易,當你有很多飼料輪詢=) – 2010-10-23 09:18:12

0

提高您在php.ini memory_limit = xxM或使用ini_set("memory_limit","xxM")其中xx是新的內存限制。

+0

你知道哪些網站使用超過32MB的ram?它的代碼不僅僅是它的一個問題。 – RobertPitt 2010-10-19 11:56:37

+0

他從來沒有說過它是一個網站。我想他是把它作爲腳本運行(cronjob或其他)。 – 2010-10-19 11:59:39

+0

我增加了memory_limit和執行時間,但它需要超過2分鐘,但沒有結果 – 2010-10-19 11:59:58

1

我對SimplePie的使用經驗是它不是很好或很強壯。請嘗試使用simplexml_import_dom()

+0

我發現它非常可靠。 – symcbean 2010-10-19 12:19:30

+0

當PHP有這麼多內置有用的函數來解析DOM時,是否有必要使用第三方代碼? – woodscreative 2010-10-19 12:37:46

1

是否有任何方法/想法從批量來源快速提取內容?

試圖同步輪詢所有500個網址會給系統帶來很大壓力。這可以通過並行運行傳輸來緩解(使用curl_multi_ *函數 - 但我在這裏獲得的SimplePie版本不會將這些用於多次傳輸)。假設組合飼料的請求量很大,那麼最好的解決方案是在當前內容設置爲過期(應用合理的最小值)時運行調度程序以將飼料下載到服務器,然後將來自存儲的數據。請注意,如果採取這種方法,您需要實現一些聰明的信號量或使用DBMS來存儲數據--PHP的文件鎖定語義並不十分複雜。

+0

也許甚至是stream和'stream_select()' – Fanis 2010-10-19 14:05:56