我一直在开发一个使用 Laravel 5 的 Web 应用程序。它在 Windows 8.1 PC 上的 localhost (xampp) 上运行。 4GB RAM,2.67GHz 处理器,非常简单。
我大多数时候查询的表包含很多行(10.000 行给予或获取) - 如此之多以至于需要编写一条执行以下操作的路由:
return User::all();
运行此命令只会返回白屏。有时 Chrome 控制台会列出 500(内部服务器错误)。
显示查询之前进行的回显或打印,但执行之后不会显示任何内容。查询另一个模型(其表只有 2 行)可以正确返回数据。
这让我得出结论,我的服务器无法很好地适应如此大量的数据。我正在尝试通过这样做来解决这个问题。
User::all()->chunk(200, function($chunkOfTickets){ /*some code*/});
我期望将数据分割成 block ,以便在服务器上更容易处理。然而,这不起作用,因为 Eloquent 首先获取所有数据(并因为无法处理而中断),然后才将其分成 block 。
感谢您的阅读。
编辑:只是一遍又一遍地测试,请求越来越多的数据。限制约为 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
额外编辑
有没有办法可以将数据库的回复分成 block ?像:
User::chunk(200)->all(); /*which obviously does not work*/
如果我直接通过 phpMyAdmin 向数据库写入看似复杂的查询,它将在 0.0045 秒内返回 37035 行。 (我怀疑 xampp 或其他东西在这里进行了一些底层优化)
最佳答案
注意:我将其发布为答案,因为它涉及一些代码。我想我完全错过了你在最初问题中的观点,因为我认为你试图将整个结果集返回给客户端。如果我仍然遗漏了什么,请发表评论,我将删除此答案。
So I want to take a set of objects, do stuff with them and save them back to the 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 触发此循环,则可能会超时,因此您应该从控制台运行它。
关于php - 优化数据库查询 - 扩展大数据 - Laravel 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167635/