Пакетные вызовы с Facebook Graph API и PHP

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

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

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

person Paul Mennega    schedule 05.11.2010    source источник


Ответы (5)


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.

person Chrisvdberge    schedule 06.11.2010
comment
Есть идеи по использованию нового Graph API для выполнения FQL-запроса? Это похоже на старый REST API... текущий PHP SDK (v2.1.2), дружественный к Graph API, похоже, не имеет каких-либо очевидных методов FQL Query. - person Paul Mennega; 10.11.2010
comment
Не уверен, что вы имеете в виду; FQL предназначен для поддержки запросов, которые не поддерживаются API-интерфейсом Graph, поэтому использование API-интерфейса Graph для создания FQL не имеет смысла? - person Chrisvdberge; 10.11.2010
comment
Язык запросов Facebook, или FQL, позволяет вам использовать интерфейс в стиле SQL для запроса данных, предоставляемых Graph API. Он предоставляет некоторые расширенные функции, недоступные в Graph API, включая объединение нескольких запросов в один вызов. - person Chrisvdberge; 10.11.2010
comment
Вы можете использовать FQL с текущим PHP SDK, указав что-то вроде array('method'=>'fql.query', 'query'=>$fql) в качестве параметра для $facebook->api. - person Michael Mior; 29.07.2011

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

// 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);

Это должно делать свое дело.

person buzzedword    schedule 03.09.2011
comment
Это мне очень помогло. Спасибо за публикацию! - person jestro; 04.10.2011
comment
Спасибо ! Но будьте осторожны: в настоящее время мы ограничиваем количество пакетных запросов до 50. developers.facebook. com/docs/reference/api/batch - person Fedir RYKHTIK; 25.05.2012
comment
Правильно: он ограничивает количество запросов в пакете до 50, а не до 50 пакетных запросов в вашем приложении. Кроме того, если вы хотите проявить творческий подход, вы можете выполнять пакетные запросы. Вы получаете безумно медленный ответ, поэтому я делал это только в приложениях, которые имеют постоянную аутентификацию и нуждаются в возможном ответе для обновления данных. Или задание cron. Или какая-то массовая операция на самом деле. У меня никогда не было проблем с пакетным ограничением, и я сделал несколько непристойных вещей с этой конечной точкой, которые заставили бы вас всех плакать от отвращения. - person buzzedword; 31.05.2012
comment
@Buzzedword Я искал это последний час, спасибо!! Они должны поместить ваш пример в документацию Facebook PHP SDK! - person jbx; 23.02.2013

Я привел пример для пакетных вызовов 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 секунды.

person Somnath Muluk    schedule 30.03.2012

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

$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');
person user363349    schedule 17.01.2011

Для пакетного API вы можете использовать Пакетный PHP-класс для Facebook.

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

<?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;
}
}

?>
person Gokhan Ozturk    schedule 17.11.2011
comment
Не могли бы вы опубликовать код или инструкции здесь? Если бы веб-сайт вышел из строя или закрылся, у нас не было бы здесь никакой информации. - person Nightfirecat; 18.11.2011