使用Laravel 4.2,我使用Artisan命令从固定长度的文本文件中读取数据并插入到我们的数据库中。我需要使用非默认连接将此数据插入到我们的数据库中。当我这样做时,我在解析数据时耗尽了内存。 '允许的内存大小为1073741824字节耗尽'。 为什么我使用非默认数据库连接耗尽内存,但是当我使用'默认'数据库 连接有效吗?
如果我使用'默认'连接,我可以加载数据没有错误。除了数据在错误的数据库中之外,工作正常。
如果我使用'静态'连接(非默认连接),每次都耗尽内存。
认为我尝试过没有成功:
我正在禁用查询记录。
\DB::disableQueryLog();
更改数据库默认连接。
\Config::set('database.default', \Config::get('database.static'));
将模型用作具有DB插入的雄辩模型
$model = new \vendor\VendorCat();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert($model->toArray());
将Model用作stdClass
$model = new \stdClass();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert(json_decode(json_encode($model), TRUE));
数据库配置:
return array(
'log' => FALSE,
'fetch' => PDO::FETCH_CLASS,
'default' => 'mysql',
'static' => 'defaultstatic',
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTION',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
'defaultstatic' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTIONSTATIC',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
'migrations' => 'migrations',
'redis' => array(
'cluster' => FALSE,
'default' => array(
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
),
),
);
用于处理数据的代码:
\DB::disableQueryLog();
$list = scandir($path, SCANDIR_SORT_ASCENDING);
foreach($list as &$file) {
$fullpath = $path . '/' . $file;
$pi = pathinfo($fullpath);
if ( strcasecmp('dat', $pi['extension']) != 0 ) {
continue;
}
$cnt++;
$this->processFile($fullpath);
$fullpath = null;
unset($fullpath);
$pi = null;
unset($pi);
}
$list = null;
unset($list);
while ( ! feof($hdl) ) {
$line = fread($hdl, $len); // fixed length text 1503 bytes
if ($line === FALSE) break;
if (strlen($line) == 0) break;
$model = new \vendor\VendorCat();
//$model = new stdClass();
/** set model properties, 86 properties, example... */
$model->engprop = trim(substr($line, 1174, 1));
$model->engho = trim(substr($line, 1176, 1));
$model->save();
// $model->setConnection(\Config::get('database.static'))->save();
// $model = new \vendor\VendorCat();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert($model->toArray());
// $model = new \stdClass();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert(json_decode(json_encode($model), TRUE));
$line = null;
unset($line);
$model = null;
unset($model);
}
答案 0 :(得分:1)
DB :: disableQueryLog()仅适用于默认连接。所以你必须为每个连接禁用它(以防止内存泄漏)。
答案 1 :(得分:-3)
我没有看完整个问题。但错误消息可以通过这种方式解决:在php.ini配置文件中更改memory_limit。它可能会在此之后发挥作用。