Php laravel内存限制错误

时间:2015-04-26 09:09:08

标签: php mysql laravel transactions out-of-memory

我正在从一个数据库迁移到另一个数据库,项目正在laravel上,所以我正在为此创建laravel命令。我有一张表有大约700000条记录。我用LIMIT和事务创建了函数来优化查询,但仍然从PHP中出现内存错误。 这是我的代码:

ini_set('memory_limit', '750M');  // at beginning of file

$circuit_c = DB::connection('legacy')->select('SELECT COUNT(*) FROM tbl_info');
$count = (array) $circuit_c[0];
$counc = $count['COUNT(*)'];
$max =  1000;
$pages = ceil($counc / $max);

    for ($i = 1; $i < ($pages + 1); $i++) {
        $offset = (($i - 1) * $max);
        $start = ($offset == 0 ? 0 : ($offset + 1));
        $infos = DB::connection('legacy')->select('SELECT * from tbl_info LIMIT ' . $offset . ', ' . $max);
        DB::connection('mysql')->transaction(function() use ($infos) {
            foreach ($infos as $info) {
                $validator = Validator::make($data = (array) $info, Info::$rules);
                if ($validator->passes()) {
                    if ($info->record_type == 'C') {
                        $b_user_new = Info::create($data);
                        unset($b_user_new);

                    }
                }
                unset($info);
                unset($validator);
            }
        });
        unset($infos);
    }

错误是这样的:

user@lenovo /var/www/info $ php artisan migratedata
PHP Fatal error:  Allowed memory size of 786432000 bytes exhausted (tried to allocate 32 bytes) in /var/www/info/vendor/laravel/framework/src/Illuminate/Database/Grammar.php on line 75

导入约50000条记录后显示错误。

2 个答案:

答案 0 :(得分:1)

这里有一种“内存泄漏”。你需要找出哪些变量占用了所有这些内存。尝试使用此函数进行调试,看看哪个变量不断增长

function sizeofvar($var) {
  $start_memory = memory_get_usage();
  $tmp = unserialize(serialize($var));
  return memory_get_usage() - $start_memory;
}

一旦你知道变量占用了所有内存,你就可以开始实施适当的措施了。

答案 1 :(得分:1)

找到答案,laravel缓存所有查询,只需:StackPanel