2016-06-17 6 views
1

データベースに40k個のエントリがあり、laravelで簡単なフェッチを使ってそれらを呼び出そうとしています。500のエラーを引き起こす行が多すぎますか?

$domains = Domain::where("available", 1)->limit(1000)->get(); 
return view('domains') 
    ->with("domains", $domains); 

これは、数千行までは正常に動作します。しかし、コールに制限を設定しないと、500エラーが表示されます。なぜ、この問題を回避する方法を見つけ出すか、Apacheのログやストレージにあるlaravelの独自のログで何かを見つけられないように見える場所を見つけ出すことができません。

+1

を確保するため、エラーで何かがなければなりませんエラー報告が有効になっている場合のログhttp://stackoverflow.com/questions/845021/how-to-get-useful-error-messages-in-php –

+0

PHPスクリプトに使用できるメモリが不足しています。 –

+4

PHPが割り当てたメモリプールを使い果たしてしまったことを喜んで賭けています。あなたは結果を改ページしなければなりません。 – Machavity

答えて

5

->chunkコマンドを利用すると、この問題を回避できます。

Domain::where('available', 1)->chunk(200, function($domain){ 
    //do whatever you would normally be doing with the rows you receive 
    // $domain stuff 
}); 

chunkコマンドの目的は、モデルのすべてのX回の反復後にメモリを解放することです。この場合、私は200

追記を示してきました - ApacheはHTTP 500を提供している場合、チャンクメソッドは第2引数としてClosureを使用するので、あなたにuse($your_varaibles);

+0

ありがとう、存在していたことを知らなかった。ということは、私は戻り値ビュー - > with( "domains"、$ domains)で$ domains変数を使用したかったということです。私は、ここではソリューションの範囲内でそれを行う方法がわかりません。リターンビューをチャンクのスコープに移動すると、この場合は200エントリのみが提供されると思います。だから私は何とかそれらを範囲外に繰り返し渡す必要がありますか?小さな説明を説明する –

+1

@DavidG遅れているのは申し訳ありません。あなたはビューにいつものようにそれらをループして使用できるコレクションにそれらをプッシュするだけです:前もってコレクションに別名をつけてください: '$ domains = collect ([]); '、あなたのループの中で、それらを' $ domains-> push($ domain); 'にプッシュします。その後、 '$ domains'を返すことができ、いつものようにあなたのビューでそれらを使用することができます。 – Ohgodwhy

関連する問題