Laravel DB 插入错误:允许的内存大小已用尽

Posted

技术标签:

【中文标题】Laravel DB 插入错误:允许的内存大小已用尽【英文标题】:Laravel DB Insert Error: Allowed Memory Size Exhausted 【发布时间】:2012-09-08 17:29:05 【问题描述】:

我在尝试将大约 20K 记录插入我的数据库时遇到了问题。我注意到,即使我在我的 foreach 循环中回显,我也没有在命令行中输出任何内容。相反,我在插入与...相关的 ~9440 条记录后出现错误

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 91 bytes) in /Users/me/Sites/Laravel/database/connection.php on line 293

这是我的代码(尝试使用 Eloquent 和 Fluent):

<?php

class Process_Controller extends Base_Controller

    public function action_migrate()
    
        $properties = DB::table('raw_properties')->get('id');
        $total = count($properties);

        foreach ($properties as $x => $p) 
            $r = RawProperty::find($p->id);
            $count = $x + 1;

            $prop_details = array(
                'column' => $r->field,
                // Total of 21 fields
            );

            DB::table('properties')->insert($prop_details);

            echo "Created #$count of $total\n";
        
    

【问题讨论】:

【参考方案1】:

公认的答案是解决症状而不是问题。问题是当你执行如此大量的查询时,Laravel 查询日志(在内存中)正在吃掉你所有的 RAM。在这里查看答案:https://***.com/a/18776710/221745

或者,简而言之,通过以下方式关闭查询日志记录:

DB::disableQueryLog()

在执行 20k 查询之前

【讨论】:

我同意。虽然在 2G 的表中插入 1M 行是不够的,但 DB::disableQueryLog() 为我修复了它。 谢谢,我宁愿解决问题而不是解决症状 是否必须再次启用此功能才能拥有 Querylogging,或者是否适用于当前脚本? 在 laravel 5 中默认禁用。所以如果你有内存问题,你必须做相反的事情来检查生成的查询:DB::enableQueryLog(); [...] dd(DB::getQueryLog());***.com/a/27753889/2152973【参考方案2】:

此错误描述了由于为脚本分配的内存不足,您的 PHP 脚本已用尽内存限制。

您需要使用 ini_set 函数增加 memory_limit 例如 ini_set('memory_limit','128M');

【讨论】:

我刚刚遇到了这个问题,增加内存限制是一个快速的解决方法。更好的解决方案是按照下面@Erik 的建议关闭查询日志

以上是关于Laravel DB 插入错误:允许的内存大小已用尽的主要内容,如果未能解决你的问题,请参考以下文章

Composer 要求内存不足。 PHP 致命错误:允许的内存大小为 1610612736 字节已用完 Voyager

查看代码以防止允许的内存限制问题

致命错误:允许的内存大小为 1610612736 字节用尽 laravel 护照

致命错误:允许的内存大小为 33554432 字节已用尽 - Laravel 8

第二个laravel项目(v5.4)PHP致命错误:允许的内存大小为134217728字节已用尽(试图分配262144字节)

如何改进我的查询以防止“PHP 致命错误:允许的内存大小”(laravel 5.2 中的排序和分页)