Время, необходимое для загрузки данных Facebook - PullRequest
0 голосов
/ 29 марта 2012

Я создаю аналитический инструмент для некоторых страниц Facebook, где я могу просматривать информацию и статистику страниц.

Проблема в том, что загрузка данных с использованием FQL занимает много времени, почти 50 секунд для полной загрузки страницы. Проблема в том, что он должен запрашивать запрос для каждого дня, когда я хочу узнать все новые лайки в течение месяца, а затем подсчитать их все.

Вот функции, которые я использую:

function getmetrics($objectid, $metrics, $end_time, $period){
    global $facebook;
    $fql = "SELECT value FROM insights WHERE object_id=$objectid AND metric='$metrics' AND end_time=end_time_date('$end_time') AND period=$period";
    $response = $facebook->api(array(
    'method' => 'fql.query',
    'query' =>$fql,
    ));
    if (!empty($response)){
        return $response[0]['value'];
    }
    else{
        return "no results found";
    }
}


function getdailymetrics($objectid, $metrics, $end_time , $days ){
    global $facebook;
    $total = 0;
    do {
        $amount = getmetrics($objectid, $metrics, $end_time, '86400');
        $total += $amount;
        $pieces = explode("-", $end_time);
        $end_time = date("Y-m-d", mktime(0, 0, 0, date($pieces[1]),date($pieces[2])-1,date($pieces[0])));
        $days--;
    } while($days > 1);
    return $total;
}

На переднем конце:

<table>
    <tr>
        <td>Total likes</td>
        <?php
            $like1 = getmetrics($samsung, 'page_fans', '2012-01-29', '0');
            $like2 = getmetrics($samsung, 'page_fans', '2012-02-26', '0');
            $likep = round((($like2/$like1)-1)*100, 2);
        ?>
        <td><?php echo $like1; ?></td>
        <td><?php echo $likep; ?>%</td>
        <td><?php echo $like2; ?></td>
    </tr>
    <tr>
        <td>New Likes</td>
        <?php
        $newlikes1 = getdailymetrics($samsung, 'page_fan_adds', '2012-01-29', '28');
        $newlikes2 = getdailymetrics($samsung, 'page_fan_adds', '2012-02-26', '28');
        $newlikep = round((($newlikes2/$newlikes1)-1)*100, 2);
        ?>
        <td><?php echo $newlikes1; ?></td>
        <td><?php echo $newlikep; ?>%</td>
        <td><?php echo $newlikes2; ?></td>
    </tr>
    <tr>
        <td>Daily New Likes</td>
        <td><?php echo round($newlikes1/28); ?></td>
        <td><?php echo $newlikep; ?>%</td>
        <td><?php echo round($newlikes2/28); ?></td>
    </tr>
</table>

Есть ли способ ускорить это или есть более эффективный способ?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вы можете попытаться уменьшить количество запросов двумя способами.Во-первых, вы можете использовать пакетные запросы для отправки до 50 запросов в FB за один запрос.Также вы можете попытаться изменить свой запрос, чтобы он запрашивал информацию в течение нескольких дней, например end_time in (values_list).Также вы можете сделать кеширование результатов.И, хотя это зависит от вашего конкретного случая, возможно, вы могли бы рассмотреть возможность получения информации с помощью демона (если у вас есть объекты для получения данных) и сохранения его в базе данных.

0 голосов
/ 30 марта 2012

Я решил проблему с другим методом извлечения данных, используя эту функцию:

function getfromuntil($objectid, $metric, $start_time, $end_time){
 global $facebook;
 try {
  $start_time = $timestamp = strtotime($start_time);
  $end_time = $timestamp = strtotime($end_time);
  $response = $facebook->api('/'.$objectid.'/insights/'.$metric.'?since='.$start_time.'&until='.$end_time);
 } catch (FacebookApiException $e){
    error_log($e);
 }
 $total = 0;
 foreach ($response['data'][0]['values'] as $value) {
    $total += $value['value'];
 }
 return $total;
}
...