php - Laravel 3 和 MYSQL 内存限制

标签 php mysql laravel-3 memory-limit

我在 Laravel 3 中的查询遇到问题。

到目前为止,我的表只有大约 90,000 行,按照 MYSQL 标准来看,这根本不算大。 老实说,我只希望在接近 10-2000 万行的地方遇到这种问题。

但是无论如何...... 我正在使用这个表进行统计,似乎我无法通过 laravel 查询整个表。当它达到内存限制时。

使用...

public function action_viewcalls(){

$calls = Call::get();
var_dump($calls);

}

什么也不返回。只是一个空白页。

如果我将其限制为仅 ID 或 Phone_no

 $calls = Call::get(array('id');
var_dump($calls);

然后我可以获得所有行并可以循环它们 但是,如果我尝试从该表的五列中获取超过 3 列。 我什么也没返回,也无法循环结果。

我什至没有收到错误消息或任何有关 MYSQL 内存限制的信息。

我刚刚得到一个空白的白页。 即使我这样做...

public function action_viewcalls(){

$calls = DB::query("SELECT * FROM calls");
var_dump($calls);

}

有什么想法吗???感觉 90,000 行不应该引起问题。 这背后的原因可能是什么?

谢谢

最佳答案

就像评论中提到的 ceejayoz 一样,PHP 很可能达到了 memory limit .

发生这种情况是因为当您调用get()时您要求 Laravel 立即将所有行返回给您。 90k 行(具体取决于行包含的内容)可能需要大量内存来一次性分配。

我今天遇到了这个问题,行数远少于 90k,在 < 1000 条记录的数据集上使用 Eloquent ORM 和急切加载关系。

仍然处理和/或显示所有记录的一些可能的解决方案:

  • 一个 Laravel 想法:使用 Pagination一次仅处理和显示数据的某些部分。我不确定 Laravel 3.x 中是否提供此功能,但 Laravel 4 确实提供了此功能。
  • 使用使用 take() 的循环和skip() ( Docs here 在本节底部)迭代大量数据。您确实需要了解PHP execution time limit不过,使用此解决方案仍然会导致问题。

    $take = 100; // adjust this however you choose
    $counter = 0; // used to skip over the ones you've already processed
    while($rows = Call::take($take)->skip($counter)->get())
    {
        // process these rows
        // ...
        $counter += $take;
    }
    
  • 另一种选择是简单地首先获取 ID,然后根据需要加载相应的记录。例如:

    $ids = Call::get(array('id'));
    foreach($ids as $id)
    {
        // grab the actual record...
        $call = Call::find($id);
        if($call)
        {
            // do stuff with this one
        }
    }
    

    不过,这仍然受到最大执行时间问题的影响,因为无论您做什么,在单个页面加载上处理这么多记录都可能会超过它。

  • 您还可以增加 PHP 的最大内存,但这在生产环境中可能并不总是可行,具体取决于您的托管提供商。
  • 我的建议:如果 Laravel 的分页不能满足您的要求(如我的情况),您可以使用上面的 take-skip 方法制作自己的分页解决方案,但使用动态链接使用 URI 中的 take 和skip 值重新加载页面。我在这里假设您计划在页面上向用户显示此信息的某些部分。这样做的优点是不会导致 PHP 的最大执行时间或内存限制问题。如果做得好,它可以很好地工作并且看起来不错。您甚至可以只使用 <select>onChange如果您确实雄心勃勃,那么可以使用 ajax 重新加载页面的一部分的处理程序。

关于php - Laravel 3 和 MYSQL 内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517714/

相关文章:

php - 如何使用ffmpeg在多个区域添加水印?

laravel - 我如何防止注销后浏览器的后退按钮登录

MySQL 保存的数据不可选

mysql - SQL Count + Left join + Group by ...缺失行

Laravel:将数据从基本 Controller 传递到 default.blade.php

php - 将 Laravel 应用程序转移到新服务器 - 无法正常工作

php - 如何在 Codeigniter 中获取特定月份的天数?

使用 For 循环的 Javascript 和 PHP

php - 生成xml时如何处理PHP中的大撇号和大引号?

MySQL 统计每日新用户 VS 回访用户(群组分析)