Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel内存限制错误_Php_Mysql_Laravel_Transactions_Out Of Memory - Fatal编程技术网

Php laravel内存限制错误

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

我目前正在从一个数据库迁移到另一个数据库,项目位于laravel上,所以我正在为此创建laravel命令。我有一张表,大约有700000条记录。我创建了带有限制和事务的函数来优化查询,但仍然从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);
    }
导入大约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;
}