9

PHP/FQL とのすべての共通の友人の接続を選択しようとしています。私の UID (540 人の友人) を使用すると、12,000 を超える接続を意味し、そのうち 6,500 を超える接続は一意です。したがって、このコードはすべての接続を返すはずですが、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);
4

7 に答える 7

7

だから、私は元の質問への答えを投稿しています。UID の配列を (適切な名前の array_chunk() PHP 関数を使用して) チャンク化し、チャンクをループしてミニクエリを実行し、それをすべて 1 つの配列に追加することで、FQL クエリの 5000 行の制限を回避することができました。 . スクリプト全体は、12,000 行以上で平均 14 秒なので、大幅な改善です。ここでアプリケーションの動作を確認できます: givememydata.com

ああ、Facebook は (まだ文書化されていない) FQL 行制限を再検討する必要があります。サーバーにさらに負担をかけるものは何ですか? 5 秒で実行される単一のクエリですか、それとも 180 秒かかる 500 個のクエリですか? 申し訳ありませんが、ベントする必要がありました。;-)

于 2010-11-27T23:32:46.497 に答える
5
$mutual_friends = $facebook->api('/me/mutualfriends/friendid');
于 2012-07-09T11:49:44.093 に答える
1

別の方法は、 fql.multiqueryメソッドを使用して、各フレンド(またはFQLクエリごとのフレンドのグループ)に対して個別のFQLクエリを作成し、それでもすべてのクエリを同じリクエストで送信することです。

于 2010-11-26T14:36:23.767 に答える
1

興味深い観察: 共通の友人を持つすべての人を見つけようとするとき、次のクエリを使用します

SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM friend WHERE uid1=$uid)

ご覧のとおり、AND 句を削除したことを除いて、クエリと非常によく似ています。

次のエラー メッセージが表示されます。

Facebookは、私がしてほしくないことを私がやろうとしていることを理解するのに十分賢いと思います。それはどういうわけか、あなたが自分の友達でもある友達の友達だけを見つけようとしているのに、私は私の友達の友達をすべて見つけようとしているという事実を検出します。

于 2012-02-03T06:41:01.437 に答える
0

FQL は、通常の SQL と同様に LIMIT をサポートします。あなたはそれを試すことができます。 http://developers.facebook.com/docs/guides/performance

それ以外の場合は、各ユーザーのフレンド ID を取得し、それらを SQL テーブルに格納してから、独自の結合を実行してクロスオーバーを取得することをお勧めします。友達リストを一度取得してから、リアルタイムの更新を購読して、リストを最新の状態に保つことができる場合があります. http://developers.facebook.com/docs/api/realtime

于 2010-11-26T18:34:24.227 に答える
0

私は同様のことをしていましたが、fbページの投稿を取得していて、マルチクエリでそれを打ち負かしたときにFBサーバーで面白いキャッシュに遭遇しました.FQLをバッチ処理することは、これを回避する方法です。ええ、5K の制限に達し、バッチ処理が 5K 未満になり、ページネーションを設定する必要がありました。これは苦痛でした。

于 2012-07-11T07:54:40.593 に答える
0

私が使用できたと思われる1つのトリックは、テーブルのインデックス可能な列の1つに基づいてクエリの数を制限することです( strpos(column_name, character / 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 個に分割したりできます。

于 2012-03-20T20:22:22.040 に答える