Facebookの共通の友人とFQL 4999/5000記録制限
-
28-09-2019 - |
質問
私はPHP/FQLとのすべての共通の友人の接続を選択しようとしています。私のUID(540人の友人)を使用して、12,000を超える接続を意味します。したがって、このコード したほうがいい すべての接続を返しますが、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秒で戻ります。この答えを1時間検索した後、私は結論に達しました。これを回避する唯一の方法は、2つの方法の混合物を使用することです。まあ、そしてここに投稿してください。このスクリプトを書き、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の配列をチャンキングすることでFQLクエリの5000行の制限を回避することができました(適切に名前が付けられたarray_chunk()php関数を使用して)。 。スクリプト全体の平均は12,000行を超えるため、大幅に改善されています。ここで職場でアプリケーションを見ることができます: givememydata.com
ああ、Facebookは(まだ文書化されていない)FQL行の制限を再考する必要があります。サーバーにもっと課税されるものは何ですか? 5秒で実行される1回のクエリまたは180秒かかる500クエリ?申し訳ありませんが、通気しなければなりませんでした。 ;-)
他のヒント
$mutual_friends = $facebook->api('/me/mutualfriends/friendid');
別の方法は、を使用することです fql.multiquery 方法、および各友人(またはFQLクエリごとの友人のグループ)の別のFQLクエリを作成しますが、同じリクエストですべてのクエリを送信します。
興味深い観察:私が共通の友人を持っているすべての人を見つけようとするとき、私は次の質問をユーザーにします
uid1からuid1、uid2を選択しますuid1 in(uid1 = $ uid where friendからuid2を選択)
ご覧のとおり、それはあなたのクエリに非常に似ていますが、私が節を削除したことを除いて。
次のエラーメッセージが表示されます。「208733のすべての友人を検索できません。ユーザーに記録されたユーザーのログインでログインしているユーザーのユーザーであるユーザーのログアップのみを検索できます」。
Facebookは、私がやりたくないことをしようとしていることを理解するのに十分賢いと思います。それはどうにかして、あなたもあなたの友人である友人の友達だけを見つけようとしているという事実を検出します。
FQLは、通常のSQLと同様に制限をサポートしています。あなたはそれを試すかもしれません。http://developers.facebook.com/docs/guides/performance
それ以外の場合は、各ユーザーの友達IDを取得し、それらをSQLテーブルに保存し、独自の参加を実行してクロスオーバーを取得することをお勧めします。友達リストを一度取得してから、リアルタイムの更新を購読して、リストを最新に保つことができる場合があります。http://developers.facebook.com/docs/api/realtime
私が使用できたと思われるトリックの1つは、テーブルのインデックス可能な列の1つに基づいてクエリのNOを制限することです(column_name、column / 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個のサブQueriesで、または33のアルフナメリフィールドに分割できます。
私は同様のことをしていましたが、FBページの投稿を取得し、マルチケリーでそれを叩いたときにFBサーバーで面白いキャッシュに出くわしました - バッチングFQLはこれを回避する方法です。ええ、5kの制限にぶつかり、5k未満でバッチをかけて、ページングを設定する必要がありました。これは痛みでした。