2010-08-09 232 views
6

我正在創建一個應用程序來幫助我們的團隊管理Twitter競賽。到目前爲止,我已經設法與API交互,並返回我需要的一組推文。Twitter競賽〜儲蓄鳴叫(PHP&MySQL)

我正在努力決定處理數據庫中推文存儲的最佳方式,多久檢查一次,以及如何確保沒有重疊或空白。

每頁最多可以獲得100條推文。目前,我目前的想法是運行一個cron腳本,每隔5分鐘左右運行一次,並且一次抓取100條推文,然後在添加它們之前通過查看數據庫來查看它們是否可以找到它們。

這有一個明顯的缺點,即每隔5分鐘運行一次針對數據庫的100個查詢,然而也有很多INSERT。我真的不喜歡。另外我寧願多一點實時。由於twitter是一項即時服務,因此我們應該儘快更新參賽者名單。

這又一次拋出了不得不反覆輪詢Twitter的弊端,雖然這可能是必要的,但我不確定我是否想要像這樣敲擊它們的API。

有沒有人對優雅的解決方案有任何想法?我需要確保捕獲所有推文,並且不要讓任何人離開,並保持db用戶的獨特性。雖然我已經考慮過只是添加一切,然後用用戶名將結果表分組,但它不整潔。

我很高興分別處理事物的顯示方面,因爲這只是從MySQL和顯示拉。但後端設計讓我頭痛,因爲我無法看到一種有效的方式來保持它不打印api或db。

+0

Twitter API政策中是否有條款說你不能保存推文? – Noz 2013-01-12 00:23:04

回答

1

Twitter的API提供了流媒體的API,它可能是你想做的事,以確保您捕捉一切什麼: http://dev.twitter.com/pages/streaming_api_methods

如果我明白你在找什麼,你可能會想要一個statuses/filter,使用track參數與您正在尋找的任何區別特徵(主題標籤,單詞,短語,位置,用戶)。

許多Twitter API庫都內置了這個功能,但基本上保持HTTP連接處於打開狀態,並且Twitter在發生時不斷髮送推文。有關詳細信息,請參閱streaming API overview。如果你的圖書館沒有爲你做,你必須檢查丟失的連接和重新連接,檢查錯誤代碼等 - 這些都在概述中。但是,當他們進來時添加它們將允許您首先完全消除重複項(除非您只允許每個用戶輸入一個條目 - 但這是您稍後將要處理的客戶端限制)。

只要不敲擊數據庫,一旦你有Twitter發送給你的東西,你就可以控制你的最終目標 - 你可以很容易地讓你的客戶端緩存他們進來時的推文,然後將它們寫入數據庫在給定的時間或計數時間間隔 - 寫入無論它每隔5分鐘收集一次,或寫一次它有100個推文,或兩者(顯然這些數字只是佔位符)。這是當你可以檢查現有的用戶名時,如果你需要的話 - 寫一個緩存列表可以讓你有最好的機會讓事情變得高效。

更新: 我上面的解決辦法可能是這樣做,如果你想獲得實時的結果(這好像你這樣做)的最佳方式。但正如在另一個答案中提到的那樣,在比賽結束後僅使用Search API來收集參賽作品就可以了,而不必擔心存儲它們 - 您可以在詢問結果時指定頁面(如搜索API鏈接),但有多少結果可以獲取整體,這可能會導致您錯過某些條目。什麼解決方案最適合您的應用程序取決於您。

+0

謝謝,這似乎是最靈活的解決方案。 – 2010-08-10 08:34:16

+0

此外,如果您向推文的ID添加UNIQUE約束,則可以批量加載來自CSV文件的推文,而不必擔心重複內容。 – Jayrox 2010-08-23 20:26:07

+0

您可以使用PHP的'fputcsv'將您需要的數據從推文保存到一個平面文件中(非常快)。然後使用MySQL的'load data local infile'並將批量加載到數據庫中。這也是非常快的。 – Jayrox 2010-08-23 20:30:54

0

我讀過你的問題,在我看來,你想複製已經存儲在Twitter的數據。沒有更多關於競爭的細節,例如用戶輸入的估計數量;無法知道是否將此信息本地存儲在數據庫中是解決此問題的最佳方法。

可能是一個更好的解決方案,跳過本地存儲重複數據並直接從Twitter拖拽參賽者,即當你試圖找到勝利者。 您可以在代碼運行時即時消除重複條目。一旦完成處理已經獲取的100個條目,您只需要調用「下一個頁面」。雖然,我不確定這是否可以直接通過Twitter API。

+0

這是可能的,我已經實現了這個功能。此外,對於度量和記錄,這些人想要我們提交的內容以及Twitter上的內容:) – 2010-08-10 08:58:03

2

在5分鐘內100個查詢不算什麼。特別是因爲推文基本上只有3條與之相關的數據:用戶ID,時間戳,推文,推特ID - 比如說,每條推文大約有170個字符的數據。除非你在4.77MHz 8088上運行你的數據庫,否則你的數據庫甚至不會在那種「負載」下閃爍。

+1

來自API的推文與其相關的數據顯着多於170個字符。 json從推特返回的每​​條推文可以超過3KB,並且經常是。 – Jayrox 2010-08-23 20:24:10

0

我認爲每X分鐘運行一次cron並將其基於推文創建日期。您可以查詢您的數據庫以查找最後錄製的推文的最後日期/時間,然後只在匹配時間時才運行選擇以防止重複。然後,當您插入到數據庫中時,使用一個或兩個包含要記錄的所有條目的插入語句來保持性能。

INSERT INTO `tweets` (id, date, ...) VALUES (..., ..., ...), (..., ..., ...), ...; 

這似乎並不過於密集...也取決於你希望雖然記錄的鳴叫的次數。另外請確保正確索引表格。