14

Facebook の管理者であるページからいくつかの洞察を得ようとしています。
私のコードは、mySQL を介して操作したいページの ID を取得します。私はその部分を含めませんでした。

この後、各 Facebook ID の page_id、name、fan_count を取得し、fancounts[].

私には2つの問題があります。

  1. パフォーマンスが非常に遅い
  2. 次のようにデータをエコーする方法が見つかりません。

私の質問は、コードを変更してパフォーマンスを向上させ、上記のようにデータを表示するにはどうすればよいですか? fql.multiquery について読みました。ここで使用できますか?

コード例を教えてください。ありがとうございました

4

3 に答える 3

5

ページがある場合n、スクリプトはn+1クエリを作成します。これがスクリプトの主な欠点です。これが低パフォーマンスの理由です。

バッチ リクエストを使用してクエリを組み合わせることができます。以下のスクリプトを使用して、目的を達成できます。n+1これらのクエリを 1 つのバッチ クエリに結合しました。したがって、スクリプトよりもはるかに高速になります。

その部分も修正しましたecho。これで、スクリプトは質問で述べたように出力を表示します。

// Get the IDs
$pages = array(); 
$pagesIds = implode(',', $pages);

// fancounts[] holds the page_id, name and fan_count of the Ids I work with
$fancounts = array();
$q = "SELECT page_id, name, fan_count FROM page WHERE page_id IN ({$pagesIds})";
$queries[] = array('method'=>'GET', 'relative_url' => 'method/fql.query?query=' . urlencode($q) );

$messages = array();
foreach( $pages as $id) 
{
   $q = "SELECT message FROM stream WHERE source_id = '$id' LIMIT 2";
   $queries[] = array('method'=>'GET', 'relative_url' => 'method/fql.query?query=' . urlencode($q) );
}

// The batch query
$batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
$pagesFanCounts = json_decode($batchResponse[0]['body'], TRUE);

foreach ($pagesFanCounts as $page)
{       
   $fancounts[] = number_format($page['page_id'],0,'','')."-".$page['name']."-".$page['fan_count'];
}

for($i=0; $i < count($fancounts); $i++) 
{
   echo '</br>',$fancounts[$i],'<br>';
   $temp = json_decode($batchResponse[$i+1]['body'], TRUE);
   foreach ($temp as $msg)
   {
      echo ($msg['message']);
      echo "</br>";
   }
}
于 2012-03-31T04:38:31.450 に答える
2

何でも試すことができますが、高速 Web アプリの黄金律に違反しているため、コードは高速に実行されません。あなたが実際に書いているのは、次のとおりです。

request1->(wait for response-> download data) -> request2 (wait for response -> 
download data)  -> and so on ......

そして、あなたが本当にすべきこと:-

request1->(wait for response-> download data)
request2->(wait for response-> download data)
request3->(wait for response-> download data)
......
......

はい、合計応答時間を短縮するために、一度に複数のリクエストを行う必要があります。この方法だけで、ブラウザはページの読み込みを高速化します。

RSSフィードフェッチャー(RSSリンクの巨大なデータベースがあります)で作業しているときに、同様の問題に直面しました。

この問題を解決するために、私はあなたに2つのことを提案できます

  1. multi-curl コマンドを使用して、複数のコマンドを一度にフェッチします。一度に複数のリクエストを行うと全体の時間が短縮されるため、スクリプトが本当に高速化されます。

  2. しかし、上記の解決策はある程度機能します。大量のデータをクエリしている場合は、php がマルチスレッドをサポートしていないため、別の場所を探す必要があります。代わりに java または node.js を使用し、その pub/sub 機能を使用して、php スクリプトと java または node.js の間のパイプラインとして redis サーバー (過小評価しないでください) を使用できます。私によると、これは最良の代替手段であり、何十万件ものレコードを取得するために使用してきましたが、失敗することはありません。

そして、私が本当にあなたを助けることができないもう 1 つのことは、あなたのインターネット接続速度です ;)

これで問題が解決することを願っています:)

ディーパック

于 2012-04-05T19:16:07.050 に答える