Laravel插入数据耗尽内存

时间:2018-02-01 22:04:00

标签: php laravel laravel-4

使用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);
}

2 个答案:

答案 0 :(得分:1)

DB :: disableQueryLog()仅适用于默认连接。所以你必须为每个连接禁用它(以防止内存泄漏)。

答案 1 :(得分:-3)

我没有看完整个问题。但错误消息可以通过这种方式解决:在php.ini配置文件中更改memory_limit。它可能会在此之后发挥作用。