こんにちわ、最近は毎日年末なにしようかなーとか考えてます。
turusukeです。
今回はFacebook のGraph APIの話です。
簡単にいうとアクセスしてきた利用者の情報を取得して返してくれるAPIです。 しかしPHP SDKを利用してGraph APIを叩いて、 やろうとしたのは、 自分の情報を取得 友達が10人20人ならばそこまで問題では無いのですが、そもそもGraph APIって??
FacebookのGraphAPIは取得できる情報が多いので 、やろうと思えば色々出来ます。
アクセスしてきた人の友だちの公開情報を取得して、友達との相性診断とか。
ソーシャルグラフの力をアプリケーションに組み込めるAPIですね。
友達の情報を取得していこうとしたのですが、
どうにも遅い。
↓
取得した情報から友達全員分のID分ループを作って取得
↓
すべての友達の情報を取得
↓
友達全員の名前表示
これが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人ずつリクエストして処理していけばいいと思います。