0

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

批处理请求应该是我的问题的解决方案,但它仍然非常缓慢。我的页面加载时间约为 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秒!但为什么?

4

1 回答 1

0

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

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

但是,您可以使用单个 FQL 查询获得相同的确切信息:

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 解决方案会更快地返回。

于 2012-06-15T21:33:55.797 回答