如何更快地制作大型Facebook API请求?

时间:2012-07-01 03:13:24

标签: php facebook facebook-graph-api

我正在使用PHP的Facebook应用程序来获取用户朋友的大量位置信息。随着用户朋友数量的增加,应用程序变得越来越慢。但是我检索的朋友信息越多,结果就越准确。

我尝试使用以下方法加快查询速度:

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

我和batched requests一起使用了这个:

$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');

但至少需要 20秒才能从用户的100位朋友中随机获取位置信息。

使用的实际代码

这部分没问题。它只需几秒钟即可完成。

$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位朋友,需要&gt;平均20秒。
  • 200位朋友,需要&gt;平均40秒。
  • 对于400位朋友,需要&gt;平均80秒,我有时会收到一条错误消息:“错误代码:1消息:发生未知错误”

为了加快速度,这意味着:

  • 更短的时间中获取相同数量的信息,或
  • 获取更多信息 相同金额时间。

2 个答案:

答案 0 :(得分: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,但是没有使用它来进行这些查询?

答案 1 :(得分:0)

我也注意到facebook的API响应时间很慢。我实际上没有开发过facebook应用程序,但也许我在处理facebook这样的按钮和评论/分享按钮方面的一些经验可以帮到你:

我建议的是,通过javascript调用异步api调用来获取数据。这样页面会为您的用户快速加载,然后在后台加载Facebook数据。您可以使用像jquery这样的库来相对轻松地完成此任务。从本质上讲,您将中断运行的代码块以将数据处理到另一个文件中,然后使用jquery调用运行该代码。

现在这是第一部分。第二部分可能是一个小技巧,以允许用户感知更快的应用程序加载时间。始终首先加载前100个朋友并显示结果数据,然后再次查询(再次使用异步调用),以完成对其余用户朋友的查询。

同样,这是从更一般的角度讲的,但希望它会有所帮助!