Laravel 插入数据 运行 内存不足

Laravel insert data run out of memory

使用 Laravel 4.2,我正在使用 Artisan 命令从固定长度的文本文件中读取数据并插入到我们的数据库中。我需要使用非默认连接将这些数据插入到我们的数据库中。当我这样做时,我 运行 在解析数据时内存不足。 'Allowed memory size of 1073741824 bytes exhausted'。 为什么我使用非默认数据库连接 运行 内存不足,但是当我使用 'default' 数据库时 连接有效吗?

如果我使用 'default' 连接,我可以无错误地加载数据。工作完美,除了数据在错误的数据库中。

如果我使用 'static' 连接(不是默认的连接),我每次都会 运行 内存不足。

认为我尝试过但没有成功:

我正在禁用查询日志记录。

\DB::disableQueryLog();

更改数据库默认连接。

\Config::set('database.default', \Config::get('database.static'));

将模型用作 Eloquent 带有数据库插入的模型

$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));

数据库配置:

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

我还没有读完整题。但是错误信息可以通过way:change memory_limit in php.ini 配置文件来解决。之后它可能会起作用。

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