2015-11-05 72 views
5

我有一个非常,非常简单的查询查询与口才耗尽允许的内存限制

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 

当我写SP get方法中的特殊列,如get(['id']);,它的工作原理没有问题。但我仍然不明白为什么它不起作用。似乎有内存泄漏,但在哪里?

当我在SQL客户端执行查询时,查询被完成withing 3毫秒,所以它看起来并不像有太多的数据回事。不幸的是,我没有安装流浪盒上的xdebug,所以我目前无法获取堆栈跟踪。

+0

什么,当你使用get([ '字段1', '字段2',...])发生;为表中的所有列? –

+0

不幸的是,这会返回相同的错误 – Musterknabe

+0

查询返回多少条记录? –

回答

1

我有类似的问题,我不认为这是特定于Laravel - 它与嵌入瓶盖做。基本上,对于解释这些闭包的流程而言,您已经溢出了128MB,并且这可能仅仅是对于嵌入式关闭而言不够。

可尝试增加你的php.ini的memory_limit的(512MB应该做的伎俩),解开你的倒闭,或者只是使用原始的SQL语句,使该查询。

2

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

相关问题