2010-11-05 51 views
8

Thiết kế ứng dụng đầu tiên của tôi đối với API đồ thị, sử dụng phiên bản 2.1.2 của thư viện PHP do Facebook cung cấp. Cố gắng tối đa hóa hiệu suất, vv ra khỏi hộp và muốn kết hợp một vài cuộc gọi với nhau thành một cuộc gọi, nhưng không thể tìm thấy bất cứ điều gì trong tài liệu ... Tôi chắc chắn tôi phải thiếu một cái gì đó đơn giản, nhưng tôi stumped.Cuộc gọi hàng loạt với API đồ thị Facebook và PHP

Tôi muốn biến những cuộc gọi (chỉ là ví dụ) thành một cuộc gọi đồng loạt duy nhất:

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

Trả lời

2

Facebook khuyến cáo sử dụng FQL cho điều này; http://developers.facebook.com/docs/guides/performance bằng cách kết hợp các yêu cầu của bạn trong truy vấn (lồng nhau).

dụ riêng của họ:

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

Nếu yêu cầu của bạn không phụ thuộc vào eachother bạn có thể sử dụng fql.multiquery

+0

Bất kỳ ý tưởng nào về việc sử dụng API đồ thị mới để thực hiện truy vấn FQL? Điều này có vẻ như API REST cũ hơn ... SDK PHP thân thiện với Graph API (v2.1.2) dường như không có bất kỳ phương thức truy vấn FQL rõ ràng nào. –

+0

Không chắc chắn ý bạn là gì; FQL là có để hỗ trợ các yêu cầu mà không thể với Graph API, do đó, bằng cách sử dụng Graph API để làm cho FQL dường như không có ý nghĩa? – Chrisvdberge

+0

"Ngôn ngữ truy vấn Facebook, hoặc FQL, cho phép bạn sử dụng giao diện kiểu SQL để truy vấn dữ liệu do Graph API cung cấp. Một số tính năng nâng cao không có sẵn trong Graph API, bao gồm việc tạo nhiều truy vấn vào một cuộc gọi duy nhất. " – Chrisvdberge

0

Tôi đã thêm một kiểm tra null mỏ:

$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

Chỉ cần một bản cập nhật cho API lô hàng mới của biểu đồ: Bạn cũng có thể thực hiện như sau:

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

Điều đó cần thực hiện thủ thuật.

+2

Điều này đã giúp tôi vô cùng. Cảm ơn đã đăng bài viết! – jestro

+1

+100 cho Buzzedword. Cảm ơn bạn!! –

+1

Cảm ơn! Nhưng hãy cẩn thận: "Chúng tôi hiện giới hạn số lượng yêu cầu hàng loạt đến 50." http://developers.facebook.com/docs/reference/api/batch/ –

0

Đối với API lô, bạn có thể sử dụng 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

Bạn có nhớ gửi mã, hoặc hướng dẫn tại đây không? Nếu trang web bị hỏng hoặc tắt, chúng tôi sẽ không có thông tin ở đây. – Nightfirecat

+0

Đây là: http://snipt.org/qpJp4 –

2

tôi đã đưa ra ví dụ cho các cuộc gọi hàng loạt các truy vấn FQL. Nó có thể giúp ai đó.

// $ 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 được mảng json của toàn bộ kết quả của thre truy vấn.

Và nó tiết kiệm rất nhiều thời gian. 3 truy vấn này riêng lẻ mất tổng cộng 9 giây. Với nhiều thứ, nó mất 7 giây. Và với yêu cầu hàng loạt phải mất 3,6 giây.

Các vấn đề liên quan