Batch Requests使ってFacebookのGraph APIへ一度に沢山のリクエストを行う方法

こんにちわ、最近は毎日年末なにしようかなーとか考えてます。
turusukeです。
今回はFacebook のGraph APIの話です。

そもそもGraph APIって??

簡単にいうとアクセスしてきた利用者の情報を取得して返してくれるAPIです。
FacebookのGraphAPIは取得できる情報が多いので 、やろうと思えば色々出来ます。
アクセスしてきた人の友だちの公開情報を取得して、友達との相性診断とか。
ソーシャルグラフの力をアプリケーションに組み込めるAPIですね。

しかしPHP SDKを利用してGraph APIを叩いて、
友達の情報を取得していこうとしたのですが、
どうにも遅い。

やろうとしたのは、

自分の情報を取得

取得した情報から友達全員分のID分ループを作って取得

すべての友達の情報を取得

友達全員の名前表示

友達が10人20人ならばそこまで問題では無いのですが、
これが100人とかになってくるとすべての処理が終わるまで
結構な時間待たされることになります。

そもそも何が遅くなる原因なのか

リクエストしてからAPI側が値を返してくれるまでに間があります。
これが積もって待ち時間が増えています。
取得した友達分の情報をルーブして叩いているので、
10人いたら100回叩いて値を返してもらっていました。
一人1秒かかっていたとしたら100秒かかることになってしまいます。

じゃあ同時にリクエストできないの?

って思ってドキュメントを鼻水垂らしながらぼーっと眺めていたら…
ありました。
Batch Requests

これを使えば同時にリクエストできそうですね。
一度に50リクエストまでという制限はありますが。
この記事を書こうと思った時は20だった気がするんですが11月30日にドキュメントの更新が入っているのでこの時に増えたのかもしれません。

利用法


  $friendArr[] = array('method' => 'GET', 'relative_url' => '/me');
  $friendArr[] = array('method' => 'GET', 'relative_url' => '/xxxxxxxxxxxx');
  …
  $response = $facebook->api('/?batch=' . json_encode($friendArr), 'POST');
  

こんな感じでパラメータが入った配列を配列に入れていって...
json_encodeしたものをAPIに渡します。

返ってくる値はJSONなので、JSでパースするなり、
PHP


foreach($response as $key => $val) {
    $response2[] =json_decode($response[$key]["body"], true);
}

foreach($response2 as $val) { print('<br/>'); print_r($val['name']); }

とかしてあげればいいのではないでしょうか。
一つ一つリクエストしたときより50倍くらいはやくなるかもしれませんね。

先述の通り、一度にリクエストできるのは50回までなので、
友達が50人以上いる場合は50人ずつリクエストして処理していけばいいと思います。