2010-11-05 3 views
8

Facebook API'sinin 2.1.2 sürümünü kullanarak, ilk uygulamamı Grafik API'ye göre tasarlama. Kutudan çıkan performansı en üst düzeye çıkarmaya çalışmak ve birkaç aramayı tek bir aramayla toplu halde toplamak, ancak belgelerinizde bir şey bulamamak istiyorum ... Eminim ki, basit bir şey eksik olmalıyım, ama güldüm.Facebook Grafik API ve PHP ile aramalar

Ben tek toplu işlem çağrısında bu çağrıları (sadece bir örnektir) çevirmek istediğiniz:

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

cevap

2

Facebook bunun için FQL kullanılmasını önerir; İsteklerinizi (iç içe) bir sorguda birleştirerek http://developers.facebook.com/docs/guides/performance .

Kendi örnek:

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

FQL sorgusu oluşturmak için yeni Graph API'yi kullanma hakkında herhangi bir fikir var mı? Bu eski REST API'sine benziyor ... geçerli Graph API dostu PHP SDK'sı (v2.1.2) herhangi bir görünür FQL Sorgulama yöntemine sahip görünmüyor. –

+0

Ne demek istediğinden emin değil; FQL, Grafik API'sinde bulunmayan istekleri desteklemek için var, bu yüzden FQL'i yapmak için Graph API'yi kullanmak mantıklı görünmüyor mu? – Chrisvdberge

+0

"Facebook Query Language veya FQL, Graph API tarafından açığa vurulan verileri sorgulamak için SQL stili bir arabirim kullanmanıza olanak tanır. Çoklu API'ları tek bir çağrıya dahil etmek de dahil olmak üzere, bazı Grafik API'sinde bulunmayan bazı gelişmiş özellikler sağlar. " – Chrisvdberge

0

kullanabilirsiniz Yeni grafik için Batch API: Ayrıca aşağıdaki gibi de çalıştırabilirsiniz:

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

Bu hile yapmalı.

50

Sadece bir güncelleme:

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

senin isteklerini birbirinden bağımlı değilseniz benimkine boş çek eklendi fql.multiquery

+2

Bu bana çok yardımcı oldu. Gönderdiğiniz için teşekkürler! Buzzedword için – jestro

+1

+100. Teşekkür ederim!! –

+1

Teşekkürler! Ancak dikkatli olun: "Şu anda parti isteklerinin sayısını 50 ile sınırlıyoruz." http://developers.facebook.com/docs/reference/api/batch/ –

0

Batch API için Facebook Batch PHP class'u kullanabilirsiniz.

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

Kodu veya talimatları burada yayınlamayı düşünür müsünüz? Web sitesi düştüğünde veya kapatıldığında, burada hiçbir bilgimiz olmazdı. – Nightfirecat

+0

İşte burada: http://snipt.org/qpJp4 –

2

Ben fql sorguları toplu görüşmeleri için örnek verdik. Birisine yardım edebilir.

// $ örnein = 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 tasarımda sorgularının bütün sonucun json dizi alır.

Ve bu çok zaman kazanıyor. Bu 3 sorgu ayrı ayrı toplam 9 saniyeyi alır. Çoklu sorgu ile 7 saniye sürer. Ve toplu talep ile 3.6 saniye sürer.