2010-11-05 28 views
8

Diseñando mi primera aplicación contra Graph API, utilizando la versión 2.1.2 de la biblioteca PHP proporcionada por Facebook. Tratando de maximizar el rendimiento, etc. de la caja y quiero agrupar algunas llamadas juntas en una sola llamada, pero no puedo encontrar nada en la documentación ... Estoy seguro de que me falta algo simple, pero estoy perplejo.Llamadas por lotes con Facebook Graph API & PHP

me gustaría convertir estas llamadas (sólo un ejemplo) en una sola llamada por lotes:

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

Respuesta

2

Facebook recomienda el uso de este FQL; http://developers.facebook.com/docs/guides/performance combinando sus solicitudes en una consulta (anidada).

Su propio ejemplo:

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

Si sus peticiones no son dependientes entre si puede utilizar fql.multiquery

+0

¿Alguna idea sobre el uso de la nueva API Graph para hacer una consulta FQL? Esto se parece a la API REST anterior ... el actual PHP SDK de PHP (v2.1.2) no parece tener ningún método FQL Query aparente. –

+0

No estoy seguro de lo que quiere decir; la FQL está ahí para admitir solicitudes que no son aptas con la API Graph, por lo que usar la API Graph para hacer FQL no parece tener sentido. – Chrisvdberge

+0

"Facebook Query Language, o FQL, le permite usar una interfaz de estilo SQL para consultar los datos expuestos por Graph API. Proporciona algunas funciones avanzadas no disponibles en la Graph API, que incluyen varias consultas en una única llamada. " – Chrisvdberge

0

añadí un cheque nulo a la mía:

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

Apenas una actualización para el nuevo gráfico Batch API: también puede ejecutarlo de la siguiente manera:

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

Eso debería hacer el truco.

+2

Esto me ayudó muchísimo. ¡Gracias por tu publicación! – jestro

+1

+100 para Buzzedword. ¡¡Gracias!! –

+1

¡Gracias! Pero tenga cuidado: "Actualmente limitamos el número de solicitudes de lotes a 50". http://developers.facebook.com/docs/reference/api/batch/ –

0

Para la API por lotes, puede usar Facebook Batch PHP class.

Here is the code you would use:

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

¿Te importaría publicar aquí el código o las instrucciones? Si el sitio web se cerró o cerró, no tendríamos información aquí. – Nightfirecat

+0

Aquí está: http://snipt.org/qpJp4 –

2

he dado ejemplo para llamadas de lote de consultas FQL. Podría ayudar a alguien.

// $ current_user = ID de 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 obtiene matriz JSON del resultado conjunto de la thre consultas.

Y está ahorrando mucho tiempo. Estas 3 consultas individuales toman un total de 9 segundos. Con multiquery, toma 7 segundos. Y con la solicitud por lotes tarda 3,6 segundos.

Cuestiones relacionadas