1

In my project i have a lot of event id's in one table. I want to loop over these id's and make a request to facebook for the additional information of that specific id.

Now i make a different http request for each ID. I would like to put this in a batch so i can pass all the id's and receive all the additional information for all of these events in one http request.

I use the Facebook PHP sdk

Jens Roels
  • 43
  • 1
  • 4

3 Answers3

8

Here is a crude example of doing two requests in a batch ...

$batch = array();

$req = array(
    'method'       => 'GET',
    'relative_url' => '/me'
);

$batch[] = json_encode($req);

$req = array(
    'method'       => 'GET',
    'relative_url' => '/me/albums'
);

$batch[] = json_encode($req);

$params = array(
    'batch' => '[' . implode(',',$batch) . ']'
);
try {
    $info = $facebook->api('/','POST',$params);
} catch(FacebookApiException $e) {
    error_log($e);
    $info = null;
}
if(!empty($info)){
    if($info[0]['code'] == '200'){
        $user_profile = json_decode($info[0]['body']);
    }
    if($info[1]['code'] == '200'){
        $user_albums  = json_decode($info[1]['body']);
    }
    echo "<pre>User Profile:\n";
    print_r($user_profile);
    echo "\nAlbums\n";
    print_r($user_albums);
    echo "<pre>";
}

This is a rough example, but it should provide the basics of doing a batch request ...

keithhatfield
  • 3,273
  • 1
  • 17
  • 24
0
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;

FacebookSession::setDefaultApplication('YOUR_APP_ID','YOUR_APP_SECRET');

// Use one of the helper classes to get a FacebookSession object.
//   FacebookRedirectLoginHelper
//   FacebookCanvasLoginHelper
//   FacebookJavaScriptLoginHelper
// or create a FacebookSession with a valid access token:
$session = new FacebookSession('access-token-here');

try {

  $response = (new FacebookRequest($session, 'GET', '/me'))->execute();

  $params = [
    [ // call 0 - get current logged in user
      "method"  => "GET",
      "relative_url"  => "me"
    ],

    [ // call 1 - get current logged in user's friends
      "method"  => "GET",
      "relative_url"  => "me/friends"
    ],

    [ // call 3 - get current logged in user's likes
      "method"  => "GET",
      "relative_url"  => "me/likes"
    ],

    [// call 4 - get current logged in user's albums and photos
      "method"  => "GET",
      "relative_url"  => "method/fql.multiquery/?queries=" . json_encode([
        "albums"  => urlencode("SELECT aid, object_id, type, name, visible, owner, cover_pid, cover_object_id, visible, photo_count, video_count FROM album WHERE owner=me()"),
        "album_covers"  => urlencode("SELECT src_big, src_small, images, aid FROM photo WHERE pid IN (SELECT cover_pid FROM #albums)"),
        "photos"  => urlencode("SELECT pid, object_id, owner, src_big, src_small, images, aid FROM photo WHERE aid IN (SELECT aid FROM #albums)")
      ])
    ];


  $response = (new FacebookRequest($session, 'POST', '?batch='.json_encode($params) ))->execute();

  $objects = $response->getGraphObject();

  foreach($objects->asArray() as $object){
    $body = json_decode($object->body, 1);
    print_r($body);
    echo "--------------\n";
  }

} catch(FacebookRequestException $e) {

  echo "Exception occured, code: " . $e->getCode();
  echo " with message: " . $e->getMessage();

}   
user3559718
  • 81
  • 1
  • 4
-3

You can batch these requests like this:

curl \
-F 'access_token=…' \
-F 'batch=[ \
        {"method": "GET", "relative_url": "me"}, \
        {"method": "GET", "relative_url": "me/friends?limit=50"} \
    ]'\
https://graph.facebook.com

https://developers.facebook.com/docs/reference/api/batch/

There is a limit of batch size of 50.

interskh
  • 2,511
  • 4
  • 20
  • 20
  • I have checked out the documentation but it's not for the PHP sdk. This example is for 2 separated query's. I would like to ask this query. $this->facebook->api( $id, 'GET', array( 'fields' => 'name,venue,privacy,location,start_time,end_time,description' ) ); But for 50 Id's at once. Don't know if this is possible with the batch request. Thx for you help! – Jens Roels Jun 14 '12 at 00:13
  • Then you just need to call `$this->facebook->api( $id, 'GET', array( 'fields' => 'name,venue,privacy,location,start_time,end_time,description', 'ids' => '[CSV LIST OF USER IDS]' ) );` – Igy Jun 14 '12 at 09:16