Facebook API 批量请求很慢

Posted

技术标签:

【中文标题】Facebook API 批量请求很慢【英文标题】:Facebook API batch request is very slow 【发布时间】:2012-06-15 16:41:46 【问题描述】:

我正在编写一个网络应用程序,它允许用户从他们的 Facebook 个人资料以及他们的朋友(他们也已授权该应用程序)的个人资料中搜索数据。最初,我循环访问朋友并进行单独的 API 调用以获取朋友数据,但这太慢了。所以我转而构建一组 API 请求并提交一个 batch request。

批处理请求应该可以解决我的问题,但它仍然非常缓慢。我的页面加载时间约为 15 秒,我不知道为什么。文档声称批处理中的每个请求都是并行处理的,但看起来确实不是这样。我的每个批处理请求都需要一个唯一的访问令牌是否相关?文档并没有表明这是一个问题,但是文档并没有说很多东西......

这是我的一个批处理查询的示例:

[
"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####",
"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####",
"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"
]

只是为了给您一些背景信息,该应用发出一个 API 请求来获取用户的朋友。然后它遍历这些结果并为每个朋友(已授权应用程序)构建一个批处理请求,并使用 php SDK 发送第二个 API 批处理请求($json_batch 是一个批处理请求,如上所示):

$rawdata = $facebook->api('?batch='.$json_batch, 'POST');

(如上例)。检查累积结果是否与用户的搜索查询匹配并回显给用户。任何想法为什么这需要 20 秒才能发生?

更新: 我添加了一些代码来跟踪脚本执行期间不同时间的时间...... 整个课程在 11-13 秒内完成。第一次 FB api 调用(对图表)需要 0.6 秒。第二批调用10-11秒!但是为什么呢?

【问题讨论】:

【参考方案1】:

我不确定为什么批处理请求需要这么长时间,但是要回答每个请求的访问令牌,没有必要这样做,除非您放置不同的令牌,如果您使用相同的令牌,那么您可以简单地 (如文档中所述):

curl \
    -F 'access_token=…' \
    -F 'batch=[ \
            "method": "GET", "relative_url": "me", \
            "method": "GET", "relative_url": "me/friends?limit=50" \
        ]'\
    https://graph.facebook.com

但是,您可以使用single FQL query 获得相同的确切信息:

SELECT uid, username, name, first_name, middle_name, last_name, work, education 
FROM user 
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())

这也消除了首先单独查询登录用户的朋友的需要,但是如果您确实有朋友 ID 列表,则可以将它们放在 IN 子句中而不是内部查询中。 也许这个 fql 解决方案会更快返回。

【讨论】:

谢谢尼赞。我担心答案可能会变成 FQL……直到现在我一直在避免它,但也许是时候“咬紧牙关”并将 API 调用重写为 FQL。我会尝试做一些测试并报告回来。 你为什么一直避免使用 fql? 我对 mysql 不是很精通,所以学习起来不太直观。翻译我上面的一个批处理查询是否容易?我想尽快尝试批处理 fql 查询,看看是否存在显着的速度差异......然后花时间更好地学习它。 您是否使用过我在答案中发布的查询?它应该提供您在批处理请求中要求的所有字段,并为登录用户的所有朋友提供结果...只需单击我的答案中的 single FQL query 链接并在资源管理器中查看结果工具。 很好,但我不确定如何将它实际包含在批处理调用中。例如,我是否应该使用这样的请求构建 JSON 对象:'relative_url' : '/fql?q=SELECT+name,+first_name,+last_name,+id,+work,+education+FROM+friends&access_token='.$token 我不太了解如何将我正在做的事情转换为 FQL

以上是关于Facebook API 批量请求很慢的主要内容,如果未能解决你的问题,请参考以下文章

Instagram 图形 API

Facebook Graph API - 来自批处理请求的同步响应

无法获得与 Facebook 应用程序的会话? (使用它的 Graph API)

facebook批量请求多个用户

Facebook Graph API Explorer 和 iOS SDK API 调用返回不同的结果

Facebook Graph API 批量 POST_ID 评论计数?