我目前正在从一个数据库迁移到另一个数据库,项目在 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条记录后出现错误。
最佳答案
这里有点“内存泄漏”。您需要找出哪些变量占用了所有这些内存。试试这个函数来调试,看看哪个变量在不断增长
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}
一旦您知道哪个变量占用了所有内存,您就可以开始实现适当的措施。
关于Php laravel内存限制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875730/