从Facebook图表api快速获取信息?

时间:2011-11-03 00:53:03

标签: php facebook-graph-api

我有一个有帖子的网站,我正在对他们实施Facebook评论。所有帖子都在一个页面中,每个帖子下面都有一个“评论(3)”链接。一旦点击它,它将转到这篇文章的评论页面,显示Facebook插件。

我的问题是从'comments(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秒左右...有关如何改进这一点的任何想法?

谢谢!

5 个答案:

答案 0 :(得分:4)

Facebook Graph API通过订阅系统支持Real-time Updates

我不确定更改通知交付是否有延迟;但是,它可以保证更高效。 收到更新后,只需将结果缓存到数据库中即可快速检索。 请注意,如果您订阅许多快速变化的物体,它可能会非常沉重。

另一种方法是安排服务器每隔几分钟(每隔几分钟?)轮询一次评论并存储信息。

或者,您可以展示该页面,然后让用户的浏览器通过AJAX查询评论计数。用户可以通过您的服务器检索信息,或者如果他们可以访问上下文中的对象,则直接从Facebook检索信息。

答案 1 :(得分:1)

我今天急于求成,所以不能给你更详细的答案,但你应该尝试做一个批量请求http://developers.facebook.com/docs/reference/api/batch/

  

Graph API的标准版本旨在实现真正的目标   轻松获取单个对象的数据并浏览连接   对象之间。它还包括有限的检索数据的能力   同时为几个对象。

     

如果您的应用程序需要能够访问大量的   单个数据中的数据 - 或者您需要更改多个对象   同时,通常更有效地批量查询而不是   制作多个单独的HTTP请求。

     

要启用此功能,Graph API支持批处理。批量允许你   在单个HTTP请求中传递多个操作的指令。您   还可以指定相关操作之间的依赖关系(如   以下部分)。 Facebook将处理您的每个独立   并行操作并处理您的相关操作   顺序。一旦所有操作完成,就合并完成   响应将传递给您,HTTP连接将是   闭合。

答案 2 :(得分:1)

您可以使用Facebook comments count plugin

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

答案 3 :(得分: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 API发出请求。

答案 4 :(得分:0)

FQL怎么样?它仅限于我认为5000个对象,但这应该足够了,它可以让你精确地确定你想要检索的内容,这可能会更快。