从Facebook Graph API快速获取信息?

3
我有一个帖子网站,并正在实现Facebook评论功能。所有帖子都将在同一页上,每个帖子下面都有一个“评论(3)”链接。一旦单击此链接,它将转到该帖子的评论页面,显示Facebook插件。
我的问题是从“评论(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;
}

似乎加载6篇文章的评论需要大约3到4秒的时间... 有什么建议可以改进吗?

谢谢!


你确定是什么导致了速度减慢吗?我猜是与 Facebook 服务器的通信有关。你能否预测性地预加载评论,无论是在你的页面上还是在你的服务器上,然后再加载其他评论呢? - Eric Cope
5个回答

4
Facebook Graph API支持通过订阅系统实时更新
我不确定更改通知传递是否有延迟,但它保证更有效。当你接收到更新时,只需将结果缓存到数据库中以便快速检索。请注意,如果您订阅了许多快速更改的对象,它可能会产生很大的负载。
另一种选择是定期轮询评论(每隔几分钟?)并存储信息。
或者,您可以呈现页面,然后用户的浏览器通过AJAX查询评论计数。用户可以通过您的服务器或直接从Facebook检索上下文对象中的信息。

是的,有延迟。您引用的页面提到了这一点:“实时服务器通常会在其发生几分钟后向您发送更改通知。”。 - Tadeck
那么,在这种情况下,为什么不选择最后一个选择呢? 当用户阅读内容(博客,我想?)时,他们的浏览器应该已经完成了对Facebook Graph API的AJAX查询。 - Deco

2
我今天很匆忙,所以不能提供更详细的答案,但是你应该尝试做一个批量请求。Graph API 的标准版本旨在让获取单个对象的数据和浏览对象之间的连接变得非常容易,它还包括有限的能力来同时检索一些对象的数据。如果你的应用程序需要在单个操作中访问大量数据,或者需要一次性对多个对象进行更改,通常比进行多个单独的 HTTP 请求更有效地批处理查询。为此,Graph API 支持批处理。批处理允许您在单个 HTTP 请求中传递多个操作的指令。您还可以指定相关操作之间的依赖关系(在下面的部分描述)。Facebook 将并行处理每个独立的操作,并按顺序处理您的相关操作。完成所有操作后,将向您返回合并的响应,并关闭 HTTP 连接。请点击http://developers.facebook.com/docs/reference/api/batch/了解更多信息。

1
你可以使用Facebook的评论计数插件
Comments(<fb:comments-count href=http://example.com/></fb:comments-count>)

0
为了进一步解释@Jont的答案,让我给您举一个批处理请求的例子。
假设我们有一个用户ID列表,我们想获取这些用户的名称。
$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 个对象,但那应该足够了,而且它允许你精确地指定要检索的内容,这可能会更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接