mysql — ошибка предела памяти php laravel

В настоящее время я делаю миграцию из одной базы данных в другую, проект находится на 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 записей.

1

Решение

Здесь есть своего рода «утечка памяти». Вам необходимо выяснить, какая из переменных занимает всю эту память. Попробуйте эту функцию для отладки и посмотрите, какая переменная постоянно растет

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

Как только вы узнаете, какая переменная занимает всю память, вы можете приступить к осуществлению соответствующих мер.

1

Другие решения

Нашел ответ, Laravel кеширует все запросы, так что просто: DB::connection()->disableQueryLog();

1

По вопросам рекламы [email protected]