2010-11-05 12 views
8

Projektowanie mojej pierwszej aplikacji na podstawie interfejsu Graph API, przy użyciu wersji 2.1.2 biblioteki PHP dostarczonej przez Facebook. Próbując zmaksymalizować wydajność, itp. Po wyjęciu z pudełka i chcesz połączyć kilka połączeń w jedno połączenie, ale nie możesz znaleźć niczego w dokumentacji ... Jestem pewien, że brakuje mi czegoś prostego, ale jestem zakłopotany.Połączenia wsadowe z interfejsem API Graph Graph i PHP

Chciałbym włączyć te połączenia (tylko przykład) do jednego dozowanego rozmowy:

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

Odpowiedz

2

Facebook zaleca stosowanie FQL do tego przeznaczonych; http://developers.facebook.com/docs/guides/performance poprzez połączenie żądań w kwerendzie (zagnieżdżonej).

swój własny przykład:

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

Jeśli żądania nie są zależne od siebie nawzajem można użyć fql.multiquery

+0

Wszelkie pomysły dotyczące korzystania z nowego interfejsu API Graph do tworzenia zapytań FQL? Wygląda to na starsze REST API ... obecny SDK PHP PHPK (v2.1.2) przyjazny dla Graph API nie wydaje się mieć żadnych jawnych metod kwerend FQL. –

+0

Nie jesteś pewien co masz na myśli; FQL jest tam, aby obsługiwać żądania, które nie są w stanie współpracować z Graph API, więc używanie interfejsu Graph API do tworzenia FQL wydaje się nie mieć sensu? – Chrisvdberge

+0

"Język zapytań na Facebooku, czyli FQL, umożliwia korzystanie z interfejsu w stylu SQL do wysyłania zapytań o dane odsłonięte przez Graph API. Zapewnia on niektóre zaawansowane funkcje niedostępne w Graph API, w tym grupowanie wielu zapytań w pojedyncze połączenie. " – Chrisvdberge

0

dodałem null czek do kopalni:

$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

właśnie aktualizacja dla nowego wykresu Batch API: Można również wykonać to w następujący sposób:

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

To powinno załatwić sprawę.

+2

To mi pomogło. Dziękujemy za publikację! – jestro

+1

+100 dla Buzzedword. Dziękuję Ci!! –

+1

Dzięki! Ale bądź ostrożny: "Obecnie ograniczamy liczbę żądań wsadowych do 50." http://developers.facebook.com/docs/reference/api/batch/ –

0

Dla interfejsu API wsadowego można użyć wartości 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

Czy mógłbyś opublikować kod lub instrukcje tutaj? Jeśli strona internetowa przestałaby działać lub została zamknięta, nie mielibyśmy tutaj żadnych informacji. – Nightfirecat

+0

Tutaj jest: http://snipt.org/qpJp4 –

2

Mam przykład dla połączeń wsadowych z FQL zapytaniami podane. To może pomóc komuś.

// $ current_user = facebook id

$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 dostaje json tablicę całego wyniku thre zapytaniami.

To dużo oszczędza czas. Te 3 zapytania pojedynczo zajmują łącznie 9 sekund. W przypadku wielokwirekcji trwa to 7 sekund. A z prośbą wsadową zajmuje to 3,6 sekundy.

Powiązane problemy