代わりに paginate を使用し、データをチャンクで処理します。Cake は、ビューに向かう 20 行ほどのチャンクを対象としています。しかし、何百万もの行に基づいてレポートを作成したいことがよくあります。CakePhp には paginate と呼ばれる関数があり、これをだまして mysql LIMIT 100000,1000 をかなり効率的に実行することができます。私はかなり熱心にグーグルでこれらのハックを見つけました.Cakephp 1.3にはわずかに異なる構文がいくつかあります.誰もCake 3に関する情報を投稿していない場合、それが変更された場合、私はおそらく戻ってきていつか投稿するでしょう.
// cakephp 2.4.1
$condition = array('conditions'=>
array('LogBackend.created_at between ? AND ?' =>
array($this->params['url']['from'],$this->params['url']['to'])));
$this->paginate['conditions'] = $conditions['conditions'];
$this->paginate['limit'] = 1000;
// could also use ['fields'] = array('filed1', 'field2'); to limit memory
/******* here is where we trick paginate to iter in the ctrlr *****/
$this->request->params['named']['page']=1;
$this->request->params['paging']['ModelName']['nextPage'] = true;
// get chunks
while ($this->request->params['paging']['ModelName']['nextPage']) {
$Rows = $this->paginate("ModelName");
// boil down this chunk of data
$this->request->params['named']['page']+=1;
}
何百万もの行をビューに戻すことは意味がありません。while ループは毎回 $Rows を上書きし、そのコア メモリを再利用します。したがって、課題は、データを抽出する賢い方法を見つけるか、ループ中に新しいテーブルを書き込んで、次の洗練のパスで使用することです。モデル処理のオーバーヘッドにより、Cakephp での実行はさらに遅くなります。そのため、不要な列が多数ある場合は、paginate['fields'] を使用して必要なフィールドのみを処理してください。フィールドは列と同じものです。
PHP は実際には哲学的に Apache に結び付けられているため、実際にはこの種のことを意図したものではありません。30 秒以内に結果を取得し、Web ページをレンダリングすることを目的としています。責任があるのはケーキだけではありません。Python と Ruby、さらには Perl の方が優れているかもしれません。しかし、ツールをふるいにかけて html にフォーマットしなければならないときは、赤ちゃんのように泣くでしょう。