Facebook共同朋友和FQL 4999/5000记录限制
-
28-09-2019 - |
题
我正在尝试选择与PHP/FQL的所有共同朋友的联系。使用我的UID(540个朋友),这意味着> 12,000个连接,其中> 6500是唯一的。所以这个代码 应该 返回所有连接,但Facebook显然在FQL查询上具有4999/5000行限制。
// select mutual unique friends
$unique_connections = $facebook->api_client->fql_query("
SELECT uid1, uid2 FROM friend
WHERE uid1 IN
(SELECT uid2 FROM friend WHERE uid1=$uid)
AND uid2 IN
(SELECT uid2 FROM friend WHERE uid1=$uid)
");
我知道上面的数字,因为我通过朋友列表编写了循环的原始代码,并为每个循环发送了一个getMutualfriend查询。
foreach ($friends as $key)
{
$mutual_friends = $facebook->api_client->friends_getMutualFriends($key);
foreach ($mutual_friends as $f_uid)
{
array_push($all_connections, array($key,$f_uid));
}
}
当然,运行该脚本需要将近3分钟,而FQL查询在5秒内返回。经过一个小时的搜索答案,我得出结论的唯一方法是使用两种方法的混合物。好吧,然后在这里发布。关于编写此脚本并击败4999/5000行限制的更好方法的任何想法吗?
这是一个FQL_Multiquery,应该做与上面相同的。它也限制为4999/5000。
$queries = '{
"user_friends":"SELECT uid2 FROM friend WHERE uid1 = '.$uid.'",
"mutual_friends":"SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM #user_friends) AND uid2 IN (SELECT uid2 FROM #user_friends)"
}';
$mq_test = $facebook->api_client->fql_multiquery(trim($queries));
print_r($mq_test);
解决方案
因此,我正在发布我最初问题的答案。我能够通过将UID数组(使用适当的命名array_chunk()php函数)绕过FQL查询的5000行限制,并通过块循环以执行迷你招标,然后将其全部附加到一个数组中。整个脚本平均为14秒,超过12,000行,因此这是一个巨大的进步。您可以在此处查看工作中的应用程序: givememydata.com
哦,Facebook应该重新考虑其FQL行限制(仍然没有证件)。他们的服务器还要征税吗?单个查询在5秒内执行或500个查询需要180秒?抱歉,不得不发泄。 ;-)
其他提示
$mutual_friends = $facebook->api('/me/mutualfriends/friendid');
另一种选择是使用 fql.Multiquery 方法,并为每个朋友(或每个FQL查询的一组朋友)构建单独的FQL查询,但仍在同一请求中发送所有查询。
一个有趣的观察结果:当我尝试找到所有有共同朋友的人时,我用了以下查询
从朋友中选择UID1,UID2(uid1)
如您所见,它与您的查询非常相似,除了我删除了该子句。
我收到以下错误消息:“无法查找208733的所有朋友。只能查找登录的用户或已登录的应用程序用户的用户朋友的登录”。
我想Facebook足够聪明,可以弄清楚我正在尝试做不想我做的事情。它以某种方式检测到这样的事实是,您正试图在我试图找到所有朋友的朋友时只找到您朋友的朋友也是您的朋友。
FQL支持一个限制,就像常规SQL一样。您可以尝试。http://developers.facebook.com/docs/guides/performance
否则,我建议为每个用户提供朋友ID,将它们存储在SQL表中,然后执行自己的加入以获取交叉。您可能只能获取一次朋友列表,然后订阅实时更新,以使您的列表保持最新。http://developers.facebook.com/docs/api/realtime
看来我能够使用的一个技巧是,基于表中的一个可索引列(使用strpos(column_name,commin_name,contrac / number))限制了否查询。
前任:
$fql = "SELECT pid,src_big,owner FROM photo WHERE album_object_id IN
(SELECT object_id FROM privacy WHERE
( object_id IN ( SELECT object_id FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE
( uid1 = " . $this->nextUser->fbid . " AND **strpos(uid2,2) = 1** )))
AND ( value = 'FRIENDS_OF_FRIENDS' OR value = 'EVERYONE' ) )) ;
这样,您可以将其分为10个子征服,也可以在33中的字母字段中分配。
我正在做类似的事情 - 但是当我用多Quallies撞击FB服务器时,请获得FB页面帖子,并遇到FB服务器的有趣缓存 - 批处理FQL是解决此问题的一种方式,顺便说一句。是的,遇到了5K限制,仅在5K以下批准,不得不设置Paginate,这很痛苦。