Пакетные звонки с Facebook Graph API и PHP - PullRequest
8 голосов
/ 05 ноября 2010

Разработка моего первого приложения на основе Graph API с использованием версии 2.1.2 поставляемой Facebook библиотеки PHP. Пытаюсь максимизировать производительность и т. Д. Из коробки и хочу объединить несколько вызовов в один вызов, но ничего не могу найти в документации ... Я уверен, что мне не хватает чего-то простого, но я в замешательстве. *

Я бы хотел превратить эти вызовы (просто пример) в один пакетный вызов:

$me     = $facebook->api('/me', $params);
$groups = $facebook->api('/me/groups', $params);

Ответы [ 5 ]

50 голосов
/ 04 сентября 2011

Просто обновление для нового API Batch Graph: Вы также можете выполнить это следующим образом:

// Save your method calls into an array
$queries = array(
    array('method' => 'GET', 'relative_url' => '/me'),
    array('method' => 'GET', 'relative_url' => '/me/groups')
);
// POST your queries to the batch endpoint on the graph.
$batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');

// Return values are indexed in order of the original array, content is in ['body'] as a JSON
// string. Decode for use as a PHP array.

$user_profile = json_decode($batchResponse[0]['body'], true);
$user_groups = json_decode($batchResponse[1]['body'], true);

Это должно помочь.

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

Я привел пример для пакетных вызовов запросов fql. Это может кому-то помочь.

// $ current_user = идентификатор Facebook

 $query1="SELECT uid, name FROM user WHERE is_app_user=1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = $current_user)";
 $query2="SELECT uid, name, work_history FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = $current_user )";
 $query3="SELECT uid, name, work, education FROM user WHERE uid = $current_user";
 $queries = array(
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query1)),
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query2)),
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query3))
            );

            $objs = $facebook->api('/?batch='.json_encode($queries), 'POST');

$ objs получает массив json всего результата запросов.

И это сильно экономит время. Это 3 запроса в отдельности занимает всего 9 секунд. С несколькими запросами это занимает 7 секунд. И с пакетным запросом это занимает 3,6 секунды.

2 голосов
/ 06 ноября 2010

Facebook рекомендует использовать для этого FQL ; http://developers.facebook.com/docs/guides/performance объединяя ваши запросы в (вложенный) запрос.

Свой пример:

$friends_locations = $facebook->api_client->fql_query(
    'SELECT hometown_location from user where uid in ' .
    '(SELECT uid2 from friend where uid1=' . $user_id . ')');

Если ваши запросы не зависят друг от друга, вы можете использовать fql.multiquery

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

Для Batch API вы можете использовать класс Facebook Batch PHP .

Вот код, который вы будете использовать :

<?php

// Facebook Batch Requests PHP Class
// by Gokhan Ozturk <gokhanozturk at gmail dot com> @ Nov 17, 2011
// Original Article: http://blog.pclabs.com.tr/gokhanozturk/2011/11/17/facebook-batch-requests-php-class/

class facebook_batch {
protected $requests = array();
protected $responses = null;
protected $cur = 1;
protected $map = array();

const MAX_NUMBER_OF_REQUESTS = 20;

public function add($path, $method = 'GET', $params = array(), $extra = array()) {
if(count($this->requests) > self::MAX_NUMBER_OF_REQUESTS) return false;

$path = trim($path, '/ ');

$body = http_build_query($params);
$body = urldecode($body);

if(strtolower($method) == 'get') {
if(count($params) > 0) {
$path .= "?" . $body;
$body = "";
}
}

$key = $this->cur++;
$this->requests[$key] = array_merge(array('relative_url' => $path, 'method' => $method, 'body' => $body), $extra);

return intval($key);
}

public function remove($key) {
unset($this->requests[$key]);
}

public function execute() {
global $facebook;

$i = 0;
foreach($this->requests as $k => $r) {
$this->map[$k] = $i++;
}

$batch = json_encode(array_values($this->requests));
$params = array('batch' => $batch);

$this->responses = $facebook->api('/', 'POST', $params);
}

public function response($key) {
if(! $this->responses) $this->execute();

$rkey = $this->map[intval($key)];
$resp = $this->responses[intval($rkey)];

if($resp['code'] != 200) return false;
return json_decode($resp['body'], true);
}

public function getRequests() {
return $this->requests;
}
}

?>
0 голосов
/ 17 января 2011

Я добавил нулевую проверку к моему:

$friends_locations = $facebook->api_client->fql_query('SELECT name,birthday_date, pic_square FROM user WHERE uid in (SELECT uid2 from friend where uid1='. $user_id .') and birthday_date > 0');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...