Serghei
Serghei

Reputation: 422

Php laravel memory limit error

I am making currently migration from one database to another, project is on laravel so I am creating laravel command for this. I have one table with about 700000 records. I have created function with LIMIT and transactions to optimize query but still getting out of memory error from PHP. Here is my code:

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);
    }

Error is this:

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

Error is show after importing about 50000 records.

Upvotes: 1

Views: 7750

Answers (2)

Serghei
Serghei

Reputation: 422

Found the answer, laravel caches all queries, so just: DB::connection()->disableQueryLog();

Upvotes: 1

Margus Pala
Margus Pala

Reputation: 8663

There is kind of a "memory leak" in here. You need to find out which of the variables is hogging all of this memory. Try this function to debug and see which variable keep on growing constantly

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

Once you know what variable is taking all the memory then you can start implementíng appropriate measures.

Upvotes: 1

Related Questions