誰もが! 私はいくつか問題があります。私の仕事は: "トランザクションテーブルを取るには、取引日ごとにグループ化された行とステータスを計算します。この操作は、ページ上にレンダリングされる統計情報を形成します"。laravelで大きなデータのhadleを最適化するには?
10万下の取引行のカウント場合、これは、この統計情報生成
public static function getStatistics(Website $website = null)
{
if($website == null) return [];
$query = \DB::table('transactions')->where("website_id", $website->id)->orderBy("dt", "desc")->get();
$transitions = collect(static::convertDate($query))->groupBy("dt");
$statistics = collect();
dd($transitions);
foreach ($transitions as $date => $trans) {
$subscriptions = $trans->where("status", 'subscribe')->count();
$unsubscriptions = $trans->where("status", 'unsubscribe')->count();
$prolongations = $trans->where("status", 'rebilling')->count();
$redirections = $trans->where("status", 'redirect_to_lp')->count();
$conversion = $redirections == 0 ? 0 : ((float) ($subscriptions/$redirections));
$earnings = $trans->sum("pay");
$statistics->push((object)[
"date" => $date,
"subscriptions" => $subscriptions,
'unsubscriptions' => $unsubscriptions,
'prolongations' => $prolongations,
'redirections' => $redirections,
'conversion' => round($conversion, 2),
'earnings' => $earnings,
]);
}
return $statistics;
}
の私の方法である - それは、すべてのライトの。しかし、カウントが150〜200kを上回っているなら - nginxは502の悪いゲートウェイを投げます。私に何をアドバイスできますか?私はbigdataの扱いにどんなexpierinceも持っていません。おそらく、私の印象に根本的な誤りがありますか?
ありがとうございました。
ありがとうございます。この処理をバックグラウンドプロセスに組み込む方法を詳しく教えてください。 Ajaxで? – Scrobot
このロジックをジョブに移動し、要求に対してロジックを実行する代わりにジョブをキューに入れます。さらに詳しい情報:https://laravel.com/docs/5.1/queues – Josh
そこから、ジョブのステータスをチェックし、完全な更新の割合を返したり、進行状況をファイルに書き込んだりするだけで "まだビジーな"ブール値を返すコントローラを持つことができますまたはチャンクの間にmemcachedします。 – Josh