Как быстро получить информацию из Facebook Graph API? - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть сайт с постами, и я внедряю комментарии Facebook на них.Все сообщения будут на одной странице, а под каждой будет ссылка «Комментарии (3)».Как только вы нажмете эту кнопку, она перейдет на страницу комментариев этого поста с плагином Facebook.

Моя проблема в том, что получение 3 из 'comments (3)' занимает некоторое время ... Как я могуоптимизировать это?Вот как выглядит страница с комментариями: https://graph.facebook.com/?ids=http://example.com/

На странице, где я получаю комментарии, это то, что у меня есть для каждого сообщения:

echo $postsClass->getCommentsCount($post['id'])

А потом вот так выглядит функция getCommentsCount:

public function getCommentsCount($postId) {
    $commentsCount = 0;
    $url = 'http://myurl.com?post=' . $postId;
    $html = file_get_contents('http://graph.facebook.com/?ids=' . $url);
    $comments = json_decode($html, true);
    if (array_key_exists('comments', $comments[$url])) {
        $commentsCount = $comments[$url]['comments'];
    }

    return $commentsCount;
}

Кажется, что загрузка комментариев к 6 сообщениям занимает около 3 или 4 секунд ... Есть идеи, как это улучшить?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 06 ноября 2011

API Graph Facebook поддерживает Обновления в режиме реального времени через систему подписки.

Я не уверен, что задержка в доставке уведомления об изменении;однако гарантированно будет более эффективным.Получив обновления, просто кэшируйте результаты в своей базе данных для быстрого поиска.Имейте в виду, что если вы подписываетесь на множество быстро меняющихся объектов, это может быть довольно большой нагрузкой.

Другой альтернативой является планирование вашего сервера так, что он будет опрашивать комментарии так часто (каждые несколько минут?) И хранить информацию..

Или вы можете представить страницу, а затем попросить браузер пользователя запросить счетчик комментариев через AJAX.Пользователь может получить информацию через ваш сервер или напрямую из Facebook, если у него есть доступ к объекту в контексте.

1 голос
/ 09 ноября 2011

Вы можете использовать Facebook плагин для подсчета комментариев :

Comments(<fb:comments-count href=http://example.com/></fb:comments-count>)
1 голос
/ 06 ноября 2011

Сегодня я в спешке, поэтому не могу дать вам более подробный ответ, но вы должны попробовать выполнить пакетный запрос http://developers.facebook.com/docs/reference/api/batch/

Стандартная версия Graph API разработана для того, чтобы сделать его действительно легко получить данные для отдельного объекта и просматривать соединения между объектами. Это также включает в себя ограниченную возможность извлечения данных для нескольких объектов одновременно.

Если вашему приложению требуется возможность доступа к значительным объемам данные за один раз - или вам нужно внести изменения в несколько объектов в то же время, часто более эффективны пакетные запросы, чем сделать несколько отдельных HTTP-запросов.

Чтобы включить это, Graph API поддерживает пакетную обработку. Дозирование позволяет передать инструкции для нескольких операций в одном HTTP-запросе. Вы также можно указать зависимости между связанными операциями (описано в раздел ниже). Facebook будет обрабатывать каждый ваш независимый операции параллельно и будут обрабатывать ваши зависимые операции последовательно. После того как все операции завершены, сводный ответ будет передан вам обратно и соединение HTTP будет закрыты.

0 голосов
/ 06 ноября 2011

А как насчет FQL? Я думаю, он ограничен 5000 объектами, но этого должно быть более чем достаточно, и он позволяет точно определить, что вы хотите получить, что, вероятно, будет быстрее.

0 голосов
/ 06 ноября 2011

Чтобы расширить ответ @ Jont, позвольте мне привести пример того, как выполнять пакетные запросы.

Допустим, у нас есть список идентификаторов пользователей, и мы хотим получить имена для этих пользователей.

$userIds = array('1234', '3456', '5678', '7890');

$queries = array();
foreach ($userIds as $userId) {
    $queries[] = array('method' => 'GET', 'relative_url' => '/'.$userId);
}

$batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
foreach ($batchResponse as $response) {
    $user = json_decode($response['body'], true);
    $users[$user['id']] = $user;
}

Это приведет к тому, что все пользователи будут получать только один http-запрос.

Как правило, рекомендуется предварительно выбирать эти данные и сохранять их локально, поскольку вы этого не делаете.хочу делать запросы к API графа на каждый запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...