laravel

时间:2015-07-14 21:18:27

标签: php mysql postgresql laravel-5

我一直在开发一个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();    
}

录制外键时,我会快速检查是否有相应的值,如果不是,我会快速向远程服务器发出额外的查询,以便将数据记录在相应的表中。

0 个答案:

没有答案