2011-11-03 62 views
3

我有一個帖子的網站,我正在對他們實施Facebook評論。所有帖子將在一個頁面中,並在每個「評論(3)」鏈接下方。點擊後,它會轉到這篇文章的評論頁面,顯示Facebook插件。從facebook圖形API快速獲取信息?

我的問題是,從'評論(3)'獲取3需要一段時間...我如何優化這個?這是怎麼當的意見是貌似頁:https://graph.facebook.com/?ids=http://example.com/

在那裏我得到的評論頁面,這是我對每一個職位:

echo $postsClass->getCommentsCount($post['id']) 

然後這是怎樣的getCommentsCount功能看起來像:

public function getCommentsCount($postId) { 
    $commentsCount = 0; 
    $url = 'http://myurl.com?post=' . $postId; 
    $html = file_get_contents('http://graph.facebook.com/?ids=' . $url); 
    $comments = json_decode($html, true); 
    if (array_key_exists('comments', $comments[$url])) { 
     $commentsCount = $comments[$url]['comments']; 
    } 

    return $commentsCount; 
} 

它似乎需要大約3或4秒加載6個職位的意見...任何想法如何改善這一點?

謝謝!

+0

是否確定什麼是慢下來了嗎?我假設它與Facebook服務器進行通信。有沒有一種方法可以預測性地預加載您的評論,無論是在您的頁面中,還是在您的服務器上,然後再加載其他評論? –

回答

4

Facebook Graph API通過訂閱系統支持Real-time Updates

我不確定變更通知交付是否有延遲;然而,它保證更高效。 當您收到更新時,只需將結果緩存在您的數據庫中即可快速檢索。 請注意,如果您正在訂閱許多快速更改的對象,則可能會造成相當大的負擔。

另一種替代方法是計劃您的服務器每隔幾分鐘輪詢一次註釋並存儲信息。

或者,您可以展示該頁面,然後讓用戶的瀏覽器通過AJAX查詢評論數量。用戶可以通過您的服務器檢索信息,或者如果他們有權訪問上下文中的對象,則可以直接從Facebook獲取信息。

+0

是的,有一個延遲。您引用的頁面提到了這一點:「_實時服務器通常會在發生幾分鐘內向您發送更改通知。」 – Tadeck

+0

那麼,在那種情況下,爲什麼不選擇最後的選擇呢? 當用戶閱讀內容(博客,我假設?)時,他們的瀏覽器應該已經完成​​了對Facebook Graph API的AJAX查詢。 – Deco

1

我在一個大奔,所以今天真的不能給你更詳細的回答,但你應該嘗試做一個批處理請求http://developers.facebook.com/docs/reference/api/batch/

標準版的圖形API的設計使其真正 輕鬆獲取單個對象的數據並瀏覽對象之間的連接 。它還包括有限的能力來同時爲幾個對象檢索數據 。

如果應用程序需要訪問一個單一的去顯著金額 數據的能力 - 或者你需要更改多個對象 一次,它往往是更有效的批你的查詢,而不是 進行多次單獨的HTTP要求。

要啓用此功能,Graph API支持批處理。批處理允許您在單個HTTP請求中通過幾條指令傳遞指令 。您還可以指定相關操作之間的依賴關係(在 下面的部分中進行了描述)。 Facebook將會並行處理您的每個獨立運營商 ,並將按順序處理您的相關業務 。一旦所有操作完成,合併的 響應將被傳回給您,並且HTTP連接將關閉 。

0

要擴展@ Jont的答案,讓我給你一個如何做批處理請求的例子。

比方說,我們有一個用戶標識列表,我們希望爲這些用戶獲取名稱。

$userIds = array('1234', '3456', '5678', '7890'); 

$queries = array(); 
foreach ($userIds as $userId) { 
    $queries[] = array('method' => 'GET', 'relative_url' => '/'.$userId); 
} 

$batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST'); 
foreach ($batchResponse as $response) { 
    $user = json_decode($response['body'], true); 
    $users[$user['id']] = $user; 
} 

這將只使用一個http請求獲取所有用戶。

一般來說,預取數據並將其存儲在本地是一個好主意,因爲您不想在每個請求中向圖API發出請求。

0

FQL呢?它僅限於我認爲5000個對象,但這應該是綽綽有餘的,它允許您準確地確定要檢索的內容,這可能會更快。

1

你可以使用Facebook comments count plugin

Comments(<fb:comments-count href=http://example.com/></fb:comments-count>)