我一直在开发一个Web应用程序,该应用程序从其自身服务器端的远程服务器读取一些数据。我正在使用Laravel,并且最初认为使用连接到远程数据库的方法开发自己的php文件会更容易。这个php的作用是:从远程服务器(postgreSQL)获取数据并使用Eloquent将其插入Laravel。这是一些代码片段。
try {
$dal = connect();
//... some validations not relevant to the question
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
$data = (array_values(pg_fetch_all($result)));
$chunkOfData = array_chunk($data, 1000);
foreach ($chunkOfData as $chunk) {
insertChunkToDB($chunk);
}
closeDB($dal);
} catch(exception $e){
Log::error('Error syncing both databases, more details: '.$e);
exit(1);
}
我的问题集中在array_chunk。
我必须这样做,因为php崩溃了"内存不足错误"。我使用了insertChunk函数,因此垃圾收集器会清理已经插入的数据。请注意,此代码完全正常运行(据我所知)。
但是......如果pg_fetch_all已经检索到了数据......那么它已经在内存中了吗?为什么程序崩溃呢?作为一个侧面问题,Laravel输入数据的速度有多快?使用较小的块(如100)会导致程序因迭代/垃圾收集之间的跳转而变慢吗?什么是最快的分裂数?
哦,顺便说一下这是函数
function insertChunkToDB($chunk){
foreach ($chunk as $element) {
$object = json_decode(json_encode($element), FALSE);
insertObjectToDB($object);
}
}
完成编码/解码,所以我可以这样做
function insertObjectToDB($element){
$LaravelModel = $element->id;
$LaravelModel = $element->name; //and so on...
$LaravelModel->save();
}
录制外键时,我会快速检查是否有相应的值,如果不是,我会快速向远程服务器发出额外的查询,以便将数据记录在相应的表中。