CodeIgniter 3 執行大量 SQL(Insert/Select) 造成記憶體不足

2016041012:48

CI 3 中大量執行 SQL 命令時,造成記憶體不足 (如執行數萬個 insert/select命令時):
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes)
in ../system/database/DB_driver.php on line 1424

原因是 system/database/DB_driver.php 中
這兩個陣列 $this->queries[] / $this->query_times[]
會持續紀錄所有執行過的 SQL 命令與執行時間
當 SQL 命令越多 (例如大量 import 資料時) 就耗用大量記憶體

解決:
在 config/databse.php 中

$db['default'] = array(
    'dsn'    => '',
    'hostname' => 'localhost',
    'username' => '',
    'password' => '',
    'database' => '',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

將 save_queries 改為 FALSE 即可

save_queries = FALSE
若要做效能分析 $this->output->enable_profiler(TRUE) 時
將不會記錄各個 SQL 命令的資料。

可這樣複寫設定:
$this->db->save_queries = TRUE;