0

ユーザーの友人の大量の位置情報を取得する PHP の Facebook アプリケーションに取り組んでいます。ユーザーの友達の数が増えるにつれて、アプリケーションはますます遅くなります。しかし、より多くの友達の情報を取得すればするほど、より正確な結果が得られます。

クエリを高速化するために、次の方法を使用しようとしました。

$facebook->api('/locations?ids=uid1,uid2,uid3,...')

そして、これをバッチリクエストと一緒に使用しました:

$batched_request = array(
    array('method' => 'GET', 'relative_url' => '/locations?ids=uid1,uid2,uid3,...'),    
    array('method' => 'GET', 'relative_url' => '/locations?ids=uid11,uid12,uid13,...'), 
    array('method' => 'GET', 'relative_url' => '/locations?ids=uid21,uid22,uid23,...'), 
    ...
);
$batch = $facebook->api('/?batch='.json_encode($batched_request), 'POST');

それでも、ユーザーのランダムな 100 人の友人のセットから位置情報を取得するには、少なくとも20 秒かかります。

実際に使用されたコード

この部分は問題ありません。わずか数秒で完了します。

$number_of_friends = "100"; // Set the maximum number of friends from which their location information is retrieved
$number_of_friends_per_request = 10; // Set the number of friends per request in the batch

$access_token = $facebook->getAccessToken();

// This is the excerpt of another batched request to get the friend ids
$request = '[{"method":"POST","relative_url":"method/fql.query?query=SELECT+uid,+name+FROM+user+WHERE+uid+IN(SELECT+uid2+FROM+friend+WHERE+uid1+=+me()+order+by+rand()+limit+'.$number_of_friends.')"}]';
$post_url = "https://graph.facebook.com/" . "?batch=" . urlencode($request) . "&access_token=" . $access_token . "&method=post";
$post = file_get_contents($post_url);
$decoded_response = json_decode($post, true);
$friends_json = $decoded_response[0]['body'];
$friends_data = json_decode($friends_json, true);
if (is_array($friends_data)) {
    foreach ($friends_data as $friend) {
        $selected_friend_ids[] = number_format($friend["uid"], 0, '.', ''); // Since there are exceptionally large id numbers
    }
}

しかし、これには問題があります。Facebook からの応答を受信するのに時間がかかりすぎます。

// Retrieve the locations of the user's friends using batched request
$i = 0;
$batched_request = array();
while ($i < ($number_of_friends/$number_of_friends_per_request)) {
    $i++;
    $friend_ids_variable_name = 'friend_ids_part_'.$i;
    $$friend_ids_variable_name = array_slice($selected_friend_ids, ($i-1)*$number_of_friends_per_request, $number_of_friends_per_request);
    if (!empty($$friend_ids_variable_name)) {
        $api_string_ids_variable_name = 'api_string_ids_'.$i;
        $$api_string_ids_variable_name = implode(',', $$friend_ids_variable_name);
        $batched_request[] = array('method' => 'GET', 'relative_url' => '/locations?ids='.$$api_string_ids_variable_name);
    }
}
$batch = $facebook->api('/?batch='.json_encode($batched_request), 'POST');
foreach ($batch as $batch_item) {
    $body = $batch_item["body"];
    $partial_friends_locations = json_decode($body, true);
        foreach ($partial_friends_locations as $friend_id => $friend_locations_data) {
            $friend_locations = $friend_locations_data["data"];
            foreach ($friend_locations as $friend_location) {
                // Process location information...
            }
        }
    }
}

上記のリクエストをより速くする方法はありますか? リクエストの応答時間をチェックするコードをいくつか配置しましたが、かなり遅いです。

  • 100 人の友達の場合、平均で 20 秒以上かかります。
  • 200 人の友達の場合、平均で 40 秒以上かかります。
  • 400 人のフレンドの場合、平均で 80 秒以上かかり、「エラー コード: 1 メッセージ: 不明なエラーが発生しました」というエラー メッセージが表示されることがあります。

高速化とは、次のことを意味します。

  • より短い時間で同じ量の情報を取得する、または
  • 同じ時間でより多くの情報を取得します。
4

2 に答える 2

2

バッチ化されたリクエストを気にする必要はありません。単一の FQL マルチクエリですべてを実現できます。

{
  "my_friends":
    "SELECT uid, name FROM user WHERE uid IN
      (SELECT uid2 FROM friend WHERE uid1 = me() ORDER BY rand() LIMIT 100)",
   "their_locations":
     "SELECT page_id, tagged_uids FROM location_post WHERE tagged_uids IN
       (SELECT uid FROM #my_friends)",
   "those_places":
      "SELECT page_id, name, location FROM page WHERE page_id IN
        (SELECT page_id FROM #their_locations"
 }

API Explorerでは、これは 800 ~ 1200 ミリ秒の範囲で実行されます。

別の質問: PHP SDK をインストールしているのに、これらのクエリを作成するために使用していないのはなぜですか?

于 2012-07-01T04:05:31.017 に答える
0

私も、facebook の API 応答時間が遅いことに気付きました。私は実際に facebook アプリケーションを開発したことはありませんが、facebook のようなボタンとコメント/共有ボタンを扱う際の私の学習のいくつかは、おそらくあなたを助けるでしょう:

私がお勧めするのは、javascript を介して非同期 API 呼び出しを使用してページをレースし、データを取得することです。このようにして、ページはユーザーに対して高速に読み込まれ、Facebook データがバックグラウンドで読み込まれます。jquery などのライブラリを使用すると、比較的簡単にこれを実現できます。基本的に、データを別のファイルに処理するために実行されるコードのチャンクを分割し、それを jquery 呼び出しで実行します。

これが最初の部分です。2 番目の部分は、ユーザーがより高速なアプリケーションの読み込み時間を認識できるようにするためのちょっとしたトリックです。常に最初の 100 人の友達を最初に読み込み、結果のデータを表示してから (再び非同期呼び出しを使用して) 2 回目のクエリを実行し、残りのユーザーの友達のクエリを終了します。

繰り返しますが、これはより一般的な観点から話していますが、うまくいけば役に立ちます!

于 2012-07-01T04:01:58.860 に答える