我一直在开发一个使用Laravel 5的网络应用程序,它运行在Windows8.1 PC上的本地主机(xampp)上。4GB内存,2,67 4GB处理器,非常简单。
大多数情况下,我正在查询的表包含了许多行(10.000赋值或取)--太多了,以至于需要编写一个路由:
return User::all();
运行此操作只返回一个白色屏幕。有时Chrome控制台会列出500 (内部服务器错误)。
将显示查询前的回显或打印,但在此之后不会执行任何回波或打印。查询另一个模型(其表只有2行)将正确返回数据。
这使我得出结论,我的服务器对这么多数据没有很好的扩展。我想通过做来解决这个问题。
User::all()->chunk(200, function($chunkOfTickets){ /*some code*/});
我预计这会将数据分割成块,这样在服务器上就更容易了。但是,这是行不通的,因为雄辩者首先获取所有的数据(因为它无法处理),然后才将其分割成块。
感谢您的阅读。
编辑:只是测试了一遍又一遍,要求越来越多的数据装载。限制大约为26000行(27000行,并返回内存不足错误)。
正如注释中所述,php日志说明了这一点。显然,我请求了太多的内存,在Laravel显示错误信息之前就崩溃了。
[01-Jul-2015 17:27:51 UTC] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8376445 bytes) in C:\xampp\htdocs\gamescaffold\vendor\laravel\framework\src\Illuminate\Support\Collection.php on line 791
额外编辑
有什么办法可以把DB的答复分块吗?像这样:
User::chunk(200)->all(); /*which obviously does not work*/
如果我直接通过phpMyAdmin向数据库写入一个看似复杂的查询,它将在0.0045秒内返回37035行。(我怀疑这里有一些由xampp或其他什么东西进行的引擎盖优化)
发布于 2015-07-02 14:53:47
注意事项:我将此作为一个答案发布,因为它涉及一些代码。我想我完全忽略了你在最初的问题中的观点,因为我认为你试图将整个结果集返回给客户端。如果我还漏掉了什么,请留下评论,我会删除这个答复。
所以我想要一组对象,用它们做一些事情,并将它们保存回DB中。
太简单了!
$chunkSize = 100; // or whatever your memory allows
$totalUsers = User::count();
$chunks = floor($totalUsers / $chunkSize);
for ($chunk = 0; $chunk <= $chunks; $chunk++) {
$offset = $chunk * $chunkSize;
$users = User::skip($offset)->take($chunkSize)->get();
foreach($users as $user)
{
// do something
$user->save();
}
}
如果花费太长时间,如果您从HTTP触发这个循环,您可能会得到一个超时,所以您可能应该从控制台运行它。
发布于 2016-09-21 06:20:41
DB::table("table")
->select('column1', 'column2')
->orderBy('column2', 'asc')
->chunk(70000, function($users) {
foreach ($users as $row) {
// To do with data
}
}
https://stackoverflow.com/questions/31167635
复制相似问题