【问题标题】:Eloquent eating up memory - Allowed memory size of 134217728 bytes exhaustedEloquent 占用内存 - 允许的内存大小为 134217728 字节已用尽
【发布时间】:2014-08-05 13:32:17
【问题描述】:

我今天尝试工作,但是我被这个错误打断了:

[Tue Aug 05 09:08:48 2014] [error] [client 93.103.209.208] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 130968 bytes) in /var/www/dev/vendor/laravel/framework/src/Illuminate/Database/Eloquuent/Model.php on line 643

导致错误的控制器/方法:

public function show($id)
{
 return $this->layout->content = View::make('users.show', array(
  'user' => User::find($id)
 ));
}

但是,如果我将User::find($id) 替换为DB::table('users')->where('id', '=', $id)->first();,它就像一个魅力。 Eloquent 发生了什么?

我尝试将 php.ini 中用于 apache 和 cli 的 memory_limit 增加到 200-230M,但没有帮助。我还尝试将其设置为 -1 以查看它是否可以工作,但没有,我只是没有从服务器得到任何响应。是的,我确实在每次更改后都重新启动了 apache。

原因

问题是由于我的 User 模型中的关联方法与它自身有关。基本上在我的用户类中,我有User { public function user() { return $this->hasOne('User'); } },它创建了一个循环。

【问题讨论】:

标签: php apache laravel eloquent


【解决方案1】:

只是分析错误消息 - 您为 PHP 设置了 128MB 的内存限制,有问题的行正在尝试分配额外的 ~131KB

使用其余内存的变量可能与此函数无关,很可能是这部分代码寻找其 131KB 只是不断地将您推到 128MB 限制。

我会使用一些日志记录机制在代码中的不同点记录memory_get_usage() 的返回值。这应该可以为您提供有关何时分配内存的一些指示,并让您弄清楚如何优化代码。

【讨论】:

    【解决方案2】:

    将您的代码更改为以下内容:

    ...
    return $this->layout->content = View::make('users.show')->with(array('user' => User::find($id)));
    ...
    // or WITHOUT return
    $this->layout->content = View::make('users.show')->with(array('user' => User::find($id)));
    

    【讨论】:

    • 不,不管有没有 return 语句,它都不会那么好用。也不是问题;
    • 好的,你有 Laravel 调试器的截图吗?
    • 日志中没有任何内容表明 Laravel 生成的脚本停止由 PHP/Apache 执行以使用大量内存,并且在涉及 Eloquent 类时发生。
    • @kellax 我已经更改了上面的代码,也许可行?让我知道;)
    • 不。这也是同样的事情。无论是否返回,它都不会进入无限循环。我发现了问题。
    猜你喜欢
    • 2012-08-29
    • 2017-08-26
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2016-04-13
    • 2015-09-23
    相关资源
    最近更新 更多