10

Facebook PHP SDKを使用する場合でも、curlを使用してデータをロードする場合$contents = file_get_contents("https://graph.facebook.com/$id?access_token=$accessToken")でも、応答が返されるまでに約1秒かかります。

大量のIDのデータをチェックする必要がある場合、これは非常に遅いと見なされます。

ブラウザでFacebookのグラフのURLを入力すると、PHPの場合の10分の1の時間で、ほぼ瞬時に結果が得られます。

この問題の原因は何ですか。また、どのブラウザでも同じように高速化するにはどうすればよいですか。私はブラウザがそれを行うことができることを知っています。PHPでも高速化する方法が必要です。

IDEA:おそらくcURLで何かを設定する必要がありますか?

私が試したこと:

  • PHPSDKを使用します。それは遅いです。そもそも使っfile_get_contents()てみたのは、PHPSDKが正しく設定されていないと思っていたからです。
  • を使用しsetopt($ch, CURLOPT_SSL_VERIFYPEER, false);ます。違いはありませんでした。編集を受け入れた後:実際、これはカールハンドルを再利用することと相まって、後続のリクエストを非常に高速にしました。

編集:これは、リクエストの実行にかかる時間を測定するために使用したコードのペーストビンです:http: //pastebin.com/bEbuqq5g。マイクロ秒と言っていたテキストを秒に修正しました。これは、この質問のコメントで書いたものと同様の結果を生成するものです。FacebookのグラフはPHPでは非常に遅いです。私のペーストビンの例のように、アクセストークンの有効期限が切れていても、同様に時間がかかることにも注意してください。

編集2:sslに部分的に問題があるはずです。http://graph.facebook.com/4(httpSなし)のベンチマークを試してみたところ、3回のリクエストで1.2秒になりましたが、同じですが、httpsでは2.2秒かかりました。ただし、これは決して解決策ではありません。アクセストークンが必要なリクエストには、httpsを使用する必要があるためです。

4

5 に答える 5

8

file_get_contentsPHPではヘッダーを適切に送信/処理しないため、ファイル転送が完了したときにHTTP接続が適切に閉じられないため、非常に遅くなる可能性があります。DNSの問題についても読んだことがありますが、それについての情報はありません。

私が強くお勧めする解決策は、FacebookへのAPI呼び出しを行うために設計されたPHP SDKを使用するか、cURL(SDKが使用する)を使用することです。cURLを使用すると、基本的にこのようなAPI呼び出しを行うように設計されているため、リクエストの多くの側面を実際に構成できます。

PHP SDK情報:https ://developers.facebook.com/docs/reference/php/

PHP SDKソース:https ://github.com/facebook/facebook-php-sdk

SDKなしでそれを行うことを選択した場合、base_facebook.phpでcURLをどのように使用するかを確認できます。cURLを使用してフェッチするために使用できるサンプルコードを次に示します。

function get_url($url)
{
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url); 
   curl_setopt($ch, CURLOPT_HEADER, FALSE);  // Return contents only
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  // return results instead of outputting
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10) // Give up after connecting for 10 seconds 
   curl_setopt($ch, CURLOPT_TIMEOUT, 60);  // Only execute 60s at most
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  // Don't verify SSL cert
   $response = curl_exec($ch);
   curl_close($ch);
   return $response;
}

$contents = get_url("https://graph.facebook.com/$id?access_token=$accessToken");

この関数は、失敗するとFALSEを返します。

PHP SDKを使用したとのことですが、cURLが設定されていない可能性があります。インストールまたは更新してみてください。それでも遅いと思われる場合は、

curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);

出力を確認してください。

于 2012-08-22T12:46:54.847 に答える
7

curl_exec()を実行せずに2回後続の呼び出しを実行しcurl_close()、HTTPキープアライブを使用できるようにするとどうなるでしょうか。

テストコード:

$ch = curl_init('https://graph.facebook.com/xxx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// FIRST REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));

// SECOND REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));

curl_close($ch);

以下は結果であり、以下からの出力の一部を示していますcurl_getinfo()

// FIRST REQUEST
[total_time] => 0.976259
[namelookup_time] => 0.008271
[connect_time] => 0.208543
[pretransfer_time] => 0.715296

// SECOND REQUEST
[total_time] => 0.253083
[namelookup_time] => 3.7E-5
[connect_time] => 3.7E-5
[pretransfer_time] => 3.9E-5

最初のリクエストはかなり遅く、あなたの経験と同じように、ほぼ1秒です。しかし、2番目のリクエスト(わずか0.25秒)の時点から、キープアライブがどの程度の違いをもたらしたかを確認できます。

もちろん、ブラウザもこの手法を使用します。ブラウザの新しいインスタンスにページを読み込むには、かなり時間がかかります。

于 2012-08-27T10:20:48.733 に答える
2

たった2つの考え:

  1. ブラウザがFacebookに永続的に接続されていないことを確認しましたか?ブラウザがDNSルックアップをキャッシュしていないこと(ホストファイルにgraph.facebook.netを追加して、DNSを除外/除外することができます)

  2. もちろん、ブラウザと同じシステム/環境からphpコードを実行しています(vmからではなく、別のホストからではありませんか?また、phpはブラウザと同じスケジューリング優先度で実行されていますか?(同じレベルなど))

于 2012-08-28T16:03:03.850 に答える
1

Graph API呼び出しを「低速」にする全体的な最大の要因は、HTTP接続です。

たぶん、いくつかのパラメータを微調整したり、より良い接続でサーバーを取得したりすることで、そこに少し改善があります。

しかし、HTTPは一般に「遅い」と見なされ、これについてできることはほとんどないため、これはおそらく大きな違いにはなりません。

大量のIDのデータをチェックする必要がある場合、これは非常に遅いと見なされます。

もちろん、処理を高速化するためにできる最善のことは、HTTPリクエストの数を最小限に抑えることです。

複数のGraphAPI呼び出しを連続して実行する必要がある場合は、代わりにバッチリクエストとして実行してみてください。これにより、データの複数の部分をクエリしながら、同時に1つのHTTPリクエストのみを作成できます。

于 2012-08-23T15:45:24.887 に答える
0

これは純粋に推測ですが、原因はFacebookがSPDYプロトコルを使用していることである可能性があります(APIに当てはまるかどうかはわかりません)。PHPは、SPDYプロトコルを使用してページをロードできません。

于 2012-08-29T08:46:50.723 に答える