Слишком много строк вызывает ошибку 500?

У меня есть 40 тыс. записей в базе данных, и я пытаюсь вызвать их, используя простую выборку в laravel.

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

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


person David G    schedule 17.06.2016    source источник
comment
Если Apache обслуживает HTTP 500, то в журналах ошибок должно быть что-то, если у вас включены отчеты об ошибках stackoverflow.com/questions/845021/   -  person Jeff Puckett    schedule 18.06.2016
comment
У вас закончилась память, разрешенная для php-скрипта.   -  person N.B.    schedule 18.06.2016
comment
Я готов поспорить, что вы исчерпали выделенный PHP пул памяти. Вам придется разбить результаты на страницы   -  person Machavity♦    schedule 18.06.2016
comment
Вы были правы насчет выделенной памяти. Очевидно, моя настройка была где-то ошибочной, или я не понял, где CentOS хранит свои журналы, поскольку этого не произошло. Я реализую решение для фрагментов, чтобы избежать слишком большого увеличения пула памяти.   -  person David G    schedule 18.06.2016


Ответы (1)


Вы можете избежать этой проблемы, используя команду ->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.

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

person Ohgodwhy    schedule 17.06.2016
comment
Спасибо, не знал, что такое существует. Дело в том, что я хотел затем использовать переменную $domains в возвращаемом представлении-›with(domains, $domains); Я не уверен, как это сделать в рамках решения здесь, так как я думаю, что простое перемещение возвращаемого представления в область действия чанка даст мне в этом случае только 200 записей. Значит, мне нужно как-то итеративно передавать их за пределы области видимости? Небольшое редактирование, чтобы объяснить - person David G; 18.06.2016
comment
@DavidG Извините за задержку ответа - вы можете просто поместить их в коллекцию таким образом, чтобы вы могли зацикливаться и использовать их, как обычно, в своих представлениях: псевдоним коллекции заранее, например: $domains = collect([]);, затем внутри ваших циклов, поместите их на него, $domains->push($domain);. Затем вы можете вернуть $domains и использовать их в своем представлении, как обычно. - person Ohgodwhy; 18.06.2016