2016-04-25 9 views
3

私のデータベース呼び出しがページの読み込み速度を大幅に低下させるという問題が発生しています。私は選挙データから複数のグラフを作成しており、テーブルには約100万行が含まれており、getCharts()メソッド内の各メソッドでこのデータを複数回クエリする必要があります。 JavaScriptに戻りデータを渡すためにLaravelのマルチスレッド

I'am using this。あなたがデータポイントをクリックすると

これらのチャートは、再人口取得します。したがって、ポイント(つまり、「democrat」)をクリックすると、ページがリロードされ、これらのメソッドが再度呼び出されます。ネイティブPHPでこのような何かを行うことが可能です天気を私は求めています何

です。サーバーはLinode上でPHP 5.2を実行しています。

foreach(function in getChartsMethod){ 
    Start a child thread to process the function. 
} 
join the threads. 
reload the page. 


public function getCharts(){ 
     $this->get_cast_chart(); 
     $this->get_party_chart(); 
     $this->get_gender_chart(); 
     $this->get_age_chart(); 
     $this->get_race_chart(); 
     $this->get_ballot_chart(); 
     $this->get_county_chart(); 
     $this->get_precinct_chart(); 
     $this->get_congressional_district_chart(); 
     $this->get_senate_district_chart(); 
     $this->get_house_district_chart(); 
     return view('elections.index'); 
    } 

サンプル方法

public function get_party_chart(){ 
     $query = DB::table($this->tableName) 
      ->select('party', DB::raw('count(*) as numVotes')) 
      ->groupBy('party') 
      ->orderBy('numVotes', 'ASC'); 

     if ($this->filterParameters != null){ 
      $query = $query->where(key($this->filterParameters), $this->operator, current($this->filterParameters)); 
     } 
     $chartData = $query->get(); 
     $chartData = $this->prepare_data_for_chart($chartData, 'party', 'numVotes'); 
     JavaScript::put(['partyChart' => $chartData]); 

    } 

答えて

2

マルチスレッドを前にStackOverflowの上で議論されているPHPで可能です。しかし、私はここにあなたを助けるどのくらいマルチスレッディング知らないHow can one use multi threading in PHP applications

。どのくらいのデータを話していますか、どのような正確さをグラフで探していますか?いくつの図表が表示されていますか?解決策の多くは文脈から来るでしょう。

私がいた場合は、バックグラウンドを持って、フロントエンドでより有用な/有用なものに膨大な量のデータを前処理します。やはり有用で/有用なものは、文脈に完全に依存する。実際のページ要求がある場合、処理されたデータを実際の「ライブ」データと比較して渡すだけで済みます。

これもまた、アプリケーションのコンテキストによって異なります。おそらくあなたは毎分のデータを必要としますが、そうでないかもしれません。

+0

テーブルのサイズは約100万行であり、これらのチャートはすべて投票数を示しています。おおまかに言えば、私はそれらをグループ化する方法(性別、党、年齢などによってshowVotes)だけです。このデータは、選挙日が終わるまで3ヶ月間毎日アップロード/更新され、その後は変更はありません。スケジューラを使用する際の問題は、このデータのバリエーションが多いため、バックグラウンドで多くのタスクを実行する必要があることです。すなわち、60歳をクリックすると、60年前の選挙データでページがリロードされます。 –

+0

たとえば、「60歳」というデータをフィルタリングしている場合、データセットはそれ以上大きくならないようにしてください。また、サーバー側の正規化を行うことで、はるかに小さなデータパケットをフロントエンドに送信できます。再びその非常に難しいこの質問に答えて非常に広いと文脈に依存して – Chris

+0

ありがとう。スケジューラとhttps://laravel.com/docs/5.1/cacheを使用してデータを先取りしてキャッシュし、データがアップロードされたときにすべてをフラッシュする方法についてどう思いますか?私は最初のページの読み込みを高速にする方法についてちょっと混乱していると思います。 –

2

クリスは権利である - それはすべてのアプリケーションに依存していますが、アプリケーションが使用できないポイントになっているされている場合は、Redisのかmemcachedの中にあなたの結果を現金化にでているはずです。