Php laravel内存限制错误
我目前正在从一个数据库迁移到另一个数据库,项目位于laravel上,所以我正在为此创建laravel命令。我有一张表,大约有700000条记录。我创建了带有限制和事务的函数来优化查询,但仍然从PHP中得到内存不足的错误。 这是我的密码:Php laravel内存限制错误,php,mysql,laravel,transactions,out-of-memory,Php,Mysql,Laravel,Transactions,Out Of Memory,我目前正在从一个数据库迁移到另一个数据库,项目位于laravel上,所以我正在为此创建laravel命令。我有一张表,大约有700000条记录。我创建了带有限制和事务的函数来优化查询,但仍然从PHP中得到内存不足的错误。 这是我的密码: ini_set('memory_limit', '750M'); // at beginning of file $circuit_c = DB::connection('legacy')->select('SELECT COUNT(*) FROM t
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);
}
导入大约50000条记录后会显示错误。这里有一种“内存泄漏”。您需要找出哪些变量占用了所有内存。尝试此函数进行调试,看看哪个变量不断增长
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}
一旦知道哪个变量占用了所有内存,就可以开始实施适当的措施。找到答案后,laravel会缓存所有查询,所以只需:
DB::connection()->disableQueryLog()代码>然后增加。。。如果你已经用完了内存,那么你只是用完了;购买更多内存,或者找到更有效的方法来迁移数据。我需要优化答案,因为我已经使用LIMIT and OFFSET优化了我的函数,可能存在其他一些有效的方法。你可以尝试以100而不是1000为单位来完成这项工作吗?只是尝试过了,没有帮助。在DB::connection('mysql'内如何)->事务(function()…
,而不是使用($infos
)`您只需在事务关闭中移动$infos=DB::connection…
?看起来有些引用仍然存在,因此PHP根本没有释放任何内存。我尝试过,但找不到内存泄漏,变量始终大小相同ic:96 Count c:128 Circuit c:840 Count:464 Pages:96 Max:96 Start:96 Offset:96 infos:7120136 Info:7488 Info data:7392 New Info:28312 PHP致命错误:第358行/var/www/Info/app/commands/MigrateDataCommand.PHP中允许的内存大小为786432000字节(试图分配5字节)
sizeofvar(DB::connection('legacy')?错误:[PDOException]不能序列化或取消序列化PDO实例
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}