使用Eloquent查询会耗尽允许的内存限制

时间:2015-11-05 09:33:31

标签: php mysql laravel eloquent

我有一个非常非常简单的查询

select * 
from `users` 
where (`active` = 1 and `newsletter` = 1) and (`terminated` = 0 or (`terminated` = 1 and `newsletter_terminated` = 1));

我正在用这样的口才建立它(当我使用toSql()

时,上面的查询得到了输出
$recipients = User::where([
    'active' => 1,
    'newsletter' => 1
])->where(function ($query) {
    $query->where('terminated', 0)
        ->orWhere(function ($query){
            $query->where('terminated', 1)
                ->where('newsletter_terminated', 1);
        });
})->get();

但是当我执行这个脚本时,我收到了错误

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /xxx/eloquent/vendor/illuminate/database/Illuminate/Database/Connection.php on line 303

当我在get方法中编写特定列时,如get(['id']);,它可以正常工作。但我仍然不明白为什么它不起作用。似乎有内存泄漏,但在哪里?

当我在SQL客户端中执行查询时,查询将以3毫秒完成,因此看起来不会有太多数据。不幸的是,我没有安装流浪盒上的xdebug,所以我目前无法获得stacktrace。

2 个答案:

答案 0 :(得分:2)

类似的事发生在我身上。检查模型中的$ with属性。也许你有太多自动加载的关系。尽量不这样做。每个对象分配内存。如果你有15000行有许多关系,并且你急切地加载每一行,那么记忆就会消失。我结束了写一个原始的mysql查询并解决了问题。

答案 1 :(得分:1)

我遇到了类似的问题,我认为它不是Laravel特有的 - 它与嵌入式闭包有关。基本上,对于解释这些闭包的过程,你会溢出128MB,这对于嵌入式闭包来说可能是不够的。

尝试在php.ini中增加memory_limit(512MB应该做的事),解开你的闭包,或者只使用原始SQL语句来进行查询。