0

私は、ユーザーが自分のFacebookプロファイルと、その友人(アプリを承認している)のデータからデータを検索できるようにするWebアプリを作成しています。最初は友達をループして、友達のデータを取得するために個別のAPI呼び出しを行っていましたが、それは非常に低速でした。そこで、APIリクエストの配列を作成し、1つのバッチリクエストを送信するように切り替えました。

バッチリクエストは私の問題の解決策になるはずですが、それでも苦痛を伴うほど遅いです。ページの読み込みに約15秒かかりますが、その理由がわかりません。ドキュメントには、バッチ内の各リクエストが並行して処理されると記載されていますが、そのようには見えません。バッチ処理された各リクエストが一意のアクセストークンを取得することは適切ですか?ドキュメントはこれが問題であることを示していませんが、ドキュメントは多くのことを述べていません...

これが私のバッチクエリの1つの例です:

[
{"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"},
{"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"},
{"method":"GET",
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"}
]

コンテキストを提供するために、アプリはユーザーの友達を取得するために1つのAPIリクエストを作成します。次に、それらの結果をループし、(アプリを承認した)各フレンドのバッチリクエストを作成し、PHP SDKを使用して2番目のAPIバッチリクエストを送信します($ json_batchは上記のようなバッチリクエストです)。

$rawdata = $facebook->api('?batch='.$json_batch, 'POST');

(上記の例)。累積結果は、ユーザーの検索クエリとの一致がチェックされ、ユーザーにエコーバックされます。これが発生するのに20秒かかる理由はありますか?

更新: スクリプトの実行中のさまざまな時点で時間を追跡するためのコードを追加しました...クラス全体が11〜13秒で実行されます。(グラフへの)最初のFBapi呼び出しには0.6秒かかります。2番目のバッチ呼び出しは10〜11秒です。しかし、なぜ?

4

1 に答える 1

0

バッチリクエストに時間がかかる理由はわかりませんが、リクエストごとにアクセストークンに応答するために、必ずしもそうする必要はありません。別のトークンを配置しない限り、同じトークンを使用している場合は、単純に(ドキュメンテーション):

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

ただし、単一のFQLクエリを使用して同じ正確な情報を取得できます。

SELECT uid, username, name, first_name, middle_name, last_name, work, education 
FROM user 
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())

これにより、ログインしたユーザーの友達を最初に個別にクエリする必要もなくなりますが、友達IDのリストがある場合INは、内部クエリの代わりにそれらを句に入れることができます。
たぶん、このfqlソリューションはより速く戻るでしょう。

于 2012-06-15T21:33:55.797 に答える