2014-10-09 66 views
2

我的網站通過捲曲查詢的Facebook的股數:緩存來自Facebook的Open Graph結果的最佳方式?

http://graph.facebook.com/?ids=MY_SITE_URL 

不過,我經常發現我已經達到了rate limit。緩存這些數據並將其顯示在頁面上的最佳機制是什麼?我的網站沒有使用數據庫,爲此創建一個數據庫似乎很愚蠢。

謝謝!

回答

3

是memcache或Redis是一個不錯的選擇。

其他方法是你可以使用Facebook的批量API功能。它會一次執行多個請求,因此在一個查詢中可以找到多個URL的共享數。 https://developers.facebook.com/docs/graph-api/making-multiple-requests/

第二個選項是你可以在php中創建全局數組。例如

$globalArray = array(); 

然後,您可以爲每個Share Count URL創建密鑰,然後存儲從API獲取的結果。例如,

$globalArray['url'] = $resultFromAPI; 

通過這種方式,你可以存儲數據,直到你刷新頁面。

第三個選項是創建每個分享計數URL的會話並將其存儲在其中,並在用戶註銷時清除會話。

那麼每次當您爲特定網址獲取份額時,請首先檢查您是否具有該網址的值?對於e.g

if(isset($_SESSION['url']) && !empty($_SESSION['url']){ 
    $count = $_SESSION['url'];  
}else{ 
    // fetch through facebook graph API 
} 

如果使用Zend框架Zend公司相比註冊表是也是一個很好的選擇,它的工作同樣喜歡PHP會議。

如果您想獲取最新信息,則需要調用Graph API。但是,您可以構建只在一小時後獲取數據的邏輯。我的意思是您可以每隔一小時清除會話以查看這些共享URL並將數據再次保存到這些會話變量中。

希望它有助於。

1

嘗試向您的請求添加應用訪問令牌。這應該理想地解決您的費率限制問題。試試看:

http://graph.facebook.com/?ids=MY_SITE_URL&access_token={app_id}|{app_secret} 

例如,你可以使用Redis的作爲高速緩存和過期時間3600的鍵(在這種情況下,也許URL的MD5散列)包含圖形API結果數據緩存中的數據一小時......

+0

用戶不會登錄我的網站,這似乎是對此解決方案的要求。那是對的嗎? – Peter 2014-10-10 03:08:01

+1

應用程序訪問令牌與使用Facebook登錄時收集的用戶訪問令牌無關:https://developers.facebook.com/docs/facebook-login/access-tokens我想知道:是否調用Graph API在每一個請求你的網站的請求作出?如果是這樣,那將是baaaad設計。 – Tobi 2014-10-10 06:22:04

+0

這就是我想要避免的。我希望爲用戶提供合理的最新信息,而且我想知道如何緩存它,因此它不會在每次頁面訪問時發出請求。 – Peter 2014-10-10 16:54:06

0

你可以使用memcache或redis來做同樣的事情。根據需要緩存每個用戶數據以及其他詳細信息。例如,您可以使用單個的ID或URL作爲緩存鍵。

1

一種方法是,您可以通過將URL轉換爲哈希並基於文件的時間戳與刷新緩存或刪除過期緩存一起使用文件名作爲URL的哈希來創建臨時文件。

//Pseudo Code 
urlHash = Hash(url) 

if urlHash path exists: 
    if check_valid_timestamp: 
     fetch_file() 
endif 

if dont have data: 
    get_data_from_url() 
    create_and_store_in_file() 
endif 

show_result() 
0

我不是高手或高級程序員。我曾經有過類似的問題,即使沒有facebook。

因此,我所做的就像是在服務器上維護了一個文件,我在其中存儲了一個時間戳和當前計數[我相信您可以在服務器中創建文件。]當每個請求到達時,時間戳與文件中的時間戳。因此,如果差異超過30分鐘[可以任意設置限制],我會再次發送API請求,並使用新的時間戳和計數更新文件。相反,如果差異小於30分鐘,我所做的就是取文件中的計數並顯示它,而不是發送API請求。

這是一個非常簡單而有效的方法。但我不知道這是不是你正在尋找的東西,它會解決你的問題。