1

たぶん私はここで簡単な何かを見逃しているかもしれません...またはたぶん私は私の問題を過ぎて見ることができないほど長い間これをコーディングしてきましたが、CakePHP(1.3)を使用してselect(MySQL)を実行すると戻ることができるはずですたとえば、2,000件のレコードがあっても結果は...そうですか?

$options = array(
    'conditions' => array(
        'Lead.campaign_id' => $campaign['Campaign']['id']
    ),
    'recursive' => -1,
    'order' => 'Lead.goal DESC',
    'contain' => false,
);

$leads = $this->Lead->find('all',$options);

それでも、このクエリは私に死の白い画面を与えます(define('LOG_ERROR', 2);セット付き)。

'limit' => 300,配列に(または同様の数..正確に300である必要はありません)を追加すると、$options結果がプルされるため、クエリ自体は問題ではないことがわかります。

'fields'さらに、配列のパラメーターを使用して返される列を制限しようとしました$options... 1つのフィールドのみを返すように指示することもできましたが、それも機能しませんでした。

また、経由で使用するSQLステートメントをエコーアウトしました

$log = $this->Lead->getDataSource()->getLog(false, false);
debug($log);

もちろん、私は'limit'それを表示するために入れなければなりませんでした(そうでなければ、私はただ死の白い画面を取得します)。次に、そのクエリを(制限なしで)phpMyAdminにコピーして貼り付けると、レコードが正常に返されます(「1,000行を表示」がオンの場合でも)。これを行うと、システムがクエリと出力を処理できると私は信じますが、おそらく私はそうすべきではないと仮定しています。

すべての行を取得し、レコードをページ分割しないようにしている理由は、ユーザーがダウンロードできるようにそれらをcsvファイルに出力する必要があるためです(この部分はすでに機能しています...クエリが機能する場合)。

これはおそらくタイムアウトの問題であり、それを提起する必要があると私に提案されましたが、それは私にとってはハックのようであり、より良い解決策があるはずです。

csvファイルのダウンロードを行っているので、クエリをファイルにストリーミングしてダウンロードする方法はありますか?それとももっと良い解決策がありますか?

4

1 に答える 1

2

おそらくメモリが不足しています (Web サーバーのエラーログを確認してください) - Cake は 2000 行すべてを配列にロードしますが、おそらくスクリプトのメモリ制限を超えています。

スクリプトのメモリ制限を引き上げることができますが、他のオプションがあります。

本当に 2000 行すべてをフェッチする必要がありますか? それほど多くのデータをユーザーに表示すると、ユーザーは理解できなくなります。ここでページネーションがうまくいくでしょうか?

すべてのデータに基づいて計算を行うことを計画している場合、おそらくクエリを書き直して、クエリで計算を行うことができますか?

PHP を使用してデータを処理する必要がある場合は、チャンク (一度に 100 レコードなど) で取得します。プロセスに時間がかかる可能性がある場合は、スクリプトのタイムアウトを高い値に設定する必要がある場合があります...

于 2012-08-24T14:10:18.627 に答える