2013-05-07 27 views
0

這是一個RSS源(A),用戶可以添加多個圖像,但他/她也可以添加來自不同用戶的RSS源(B)與圖像。當請求提要(A)時,服務器將提取提要(B),然後將提要中的圖像添加到請求的提要(A)中。從其他RSS源構建RSS,如何防止循環/遞歸/循環包含?

什麼是防止無限循環遞歸的機制或選項?
例如當進料(B)還包括飼料(A)

// Feed A setup 
// - image1a 
// - image2a 
// - feed-B 

// Feed B setup 
// - image1b 
// - feed-A 

// fetching/assembling feed A 
// - image1a 
// - image2a 
// - (A fetches feed-B) 
// - image1b 
// - (B fetches feed-A) 
// - image1a 
// - image2a 
// - (fetched A fetches feed-B again) 
// - image1b 
// - (second B fetches feed-A again) 
// .. recursion 
+0

你可以顯示你的代碼以供進一步參考嗎?這樣我們都可以知道你在做什麼? – NullPointer 2013-05-07 08:42:05

+0

僞碼或多或少,foreach($ items); if($ feed)simplexml_load_file($ feed); addfeedimages(); - 我開始考慮在各個圖像中添加一個唯一的feed_id,以便如果供稿A在外部供稿的圖像中遇到其自己的feed_id中的一個,則可能會發生遞歸。如果feed-player可以忽略RSS XML項目上的這些額外的feed_id節點,這可能會起作用。然而!如果在進給(B)和進給(C)之間發生遞歸,則進給(A)將不知道。 – GDmac 2013-05-07 10:08:45

+0

沒有示例代碼,很難爲查詢編寫完整的代碼。你必須展示一些代碼工作。那我們可以幫忙。 – NullPointer 2013-05-07 10:23:17

回答

1

有三種解決方案:

  • 存儲原始資訊提供ID與每個項目並轉發最初只創造了各飼料項目,
  • 或轉發每個Feed的所有項目,並傳遞項目已進入的所有Feed的列表(並檢查該列表),
  • 或爲每個RSS使用唯一的itemID,僅存儲一次,放置唯一約束或itemID上的主鍵,因此永遠不會爲eac存儲兩次項目小時飼料。
+1

感謝您的回答。問題在於,在組裝飼料時,會取出外部飼料。無法阻止其他Feed獲取此Feed,因此我使用了文件鎖定。我玩我自己的feed-id,但最後依靠guid。如果其他feed可以具有相同的圖像(與sha1相同的guid),那麼我也爲guid添加了一個唯一的ID。 – GDmac 2013-05-08 15:27:24

1

事實證明,解決方案分幾個階段。

1鎖定:根據請求返回緩存的XML副本。在構建供稿XML期間,設置一個鎖。這可以防止獲取此提要的外部提要觸發第二個新的構建。外部Feed只會收到緩存的XML。

2標識項目:該鎖可以阻止潛在的失控進程,但源XML在每個請求中都會隨之前緩存的XML項目增長。爲防止重複,請爲每個「guid」字段添加一個唯一標識符。如果某個項目是Feed自己的項目,請不要包含它並記錄消息(並在需要時通知)。