我正在编写一个网络应用程序,允许用户从他们的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秒!但是为什么?
答案 0 :(得分:0)
我不确定为什么批量请求需要那么长时间,但是为了按照请求回答访问令牌,不一定要这样做,除非你使用不同的令牌,如果你使用相同的令牌,那么你可以简单地(如在文档中):
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解决方案会更快返回。