Facebook共同朋友和FQL 4999/5000记录限制

ow3*_*w3n 9 php facebook facebook-fql fql.multiquery

我正在尝试用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)
 ");
Run Code Online (Sandbox Code Playgroud)

我知道上面的数字,因为我写的原始代码循环通过我的朋友列表,并为每个代码发送一个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)); 
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,运行该脚本需要将近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);
Run Code Online (Sandbox Code Playgroud)

ow3*_*w3n 7

所以,我发布了原始问题的答案.通过分块UID数组(使用适当命名的array_chunk()PHP函数)并循环遍历块以执行迷你查询,然后将其全部追加到一个数组中,我能够绕过FQL查询的5000行限制.超过12,000行的整个脚本平均为14秒,这是一个巨大的进步.您可以在此处查看应用程序:givememydata.com

哦,Facebook应该重新考虑他们(仍未记录的)FQL行限制.什么是他们的服务器更多的负担?在5秒内执行的单个查询或需要180秒的500个查询?对不起,不得不发泄.;-)


小智 5

$mutual_friends = $facebook->api('/me/mutualfriends/friendid');
Run Code Online (Sandbox Code Playgroud)