2011-11-03 34 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>)