PHP/Mysql“;致命错误:已耗尽允许的内存大小..”;当试图在块中插入大量数据时

PHP/Mysql“;致命错误:已耗尽允许的内存大小..”;当试图在块中插入大量数据时,php,laravel,mysqli,Php,Laravel,Mysqli,我正在将一个旧的PHP项目迁移到一个新的Laravel应用程序。有几百万条记录表user\u category\u views,我正计划成批迁移这些记录。我用mysqli获取旧记录,用LaravelDB::Statement插入。由于某种原因,在大约一百万条记录之后,该代码将下降,但例外情况除外: 致命错误:已耗尽268435456字节的允许内存大小(尝试分配73728字节) 什么东西在这里溢出了记忆?也许$result->free()的工作方式和我想的不一样 $count=2000000;//

我正在将一个旧的PHP项目迁移到一个新的Laravel应用程序。有几百万条记录表
user\u category\u views
,我正计划成批迁移这些记录。我用
mysqli
获取旧记录,用Laravel
DB::Statement
插入。由于某种原因,在大约一百万条记录之后,该代码将下降,但例外情况除外:

致命错误:已耗尽268435456字节的允许内存大小(尝试分配73728字节)

什么东西在这里溢出了记忆?也许
$result->free()
的工作方式和我想的不一样

$count=2000000;//实际数量将从计数(*)stmt接收
$vendors=[561=>'618',784=>'512'/*等等*/];
$step=5000;
对于($i=0;$imysqli->query($q)){
$stmt=“在供应商视图中插入(`vendor\u id`、`counter`、`created\u at`)值”;
/*获取关联数组*/
而($row=$result->fetch_assoc()){
$vendor\u id=null;
$id=$row['user\u category\u id'];
//在这里,我试图阻止拉威尔
//如果条目
//在$vendors数组中找不到。
//这是我从js编码中养成的习惯
试一试{
$vendor_id=$vendors[$id];
}捕获(例外$e){
继续;
}
如果(空($vendor_id))继续;
$counter=$row['counter'];
$created=$row['created'];
$stmt.=“($vendor_id,$counter,'{$created}'),”;
}
$result->free();
DB::语句(trim($stmt,“,”);
$stmt=null;
}
}

您的问题是因为内存有限。 尝试在PHP文件的顶部设置:

ini_set('memory_limit', '-1');
增加PHP的内存限制

如果上述解决方案不起作用。也许你的公羊已经死了。请检查一下。 您还可以减少步长,如$step=5000;至$step=1000;我觉得这样更好


希望能有所帮助。谢谢

谢谢Nigel Ren,他指出我滥用了try/catch结构

所以不是

    .....
    try{
        $vendor_id = $vendors[$id];
    } catch (Exception $e) {
        continue;
    }
    ....
我现在用

$vendor_id = $vendors[$id]??null;

并且不再有内存泄漏问题。虽然不知道为什么,但现在它工作了

你想用代码做什么
$vendor\u id=$vendors[$id]
try…catch…
中?如果在数组$vendors[]中找不到记录,Laravel将引发异常。您是否使用Laravel 6.x?如果使用PHP7+,请使用类似
$vendor\u id=$vendors[$id]?null的内容
或先检查值是否存在。@IGP yesp Laravel 6.x使用块的想法是能够使用少量内存。每5公里记录一次,我就会公布结果