2016-06-17 2 views
1

У меня есть 40k записей в базе данных, и я пытаюсь назвать их с помощью простой выборки в laravel.Слишком много строк, вызывающих 500 ошибок?

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

Это работает отлично до нескольких тысяч строк. Но если я не устанавливаю ограничение на вызов, я получаю 500 ошибок. Я не могу понять, почему, и я не могу решить, где бы я хотел найти, как избежать этой проблемы, я не могу найти ничего в журналах apache или собственных журналах laravel, находящихся на складе.

+1

Если Apache обслуживает HTTP 500, то должно быть что-то в ошибке журналы, если у вас включена поддержка отчетов об ошибках. 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.

Sidenote - Поскольку метод ломоть использует Closure в качестве 2-го аргумента, чтобы у вас use($your_varaibles);

+0

Спасибо, не знал, что существует. Дело в том, что я хотел бы использовать переменную $ domains в представлении return-> с («домены», $ domains); Я не уверен, как это сделать в рамках решения здесь, так как я предполагаю, что просто перемещение возвращаемого представления в область куска предоставит мне в этом случае только 200 записей. Поэтому мне нужно как-то передать их итеративно за пределы сферы действия? Небольшое редактирование для объяснения –

+1

@DavidG Извините за задержанный ответ - вы можете просто вставить их в коллекцию так, как вы можете ее использовать, и использовать их, как обычно, в своих представлениях: Псевдоним коллекции раньше времени, например: '$ domains = collect ([]); ', затем внутри ваших циклов, надавите на него,' $ domains-> push ($ domain); '. Затем вы можете вернуть '$ domains' и использовать их в своем представлении, как обычно. – Ohgodwhy

Смежные вопросы