ちょっと厨二っぽいSEのブログ

プログラミングとかのシステム備忘録など

【mysql】CodeIgniterのDB設定の罠【Sleep】

前回の記事ryokwkm2.hatenadiary.jp


この時なにが起こっていたのかを書きます

Sleepしてるクエリが多いから消してやればいいやーAHAHAHAとはさすがになりません
これが起きた原因を排除します

結論からいいますと、phpフレームワーク codeIgniter のDB設定に問題がありました


正しい設定は以下の通り

$db['default']['hostname'] = 'XXX.XXX.XXX.XXX';
$db['default']['username'] = 'ユーザー名';
$db['default']['password'] = 'パスワード';
$db['default']['database'] = 'DB名';

$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = FALSE;
$db['default']['stricton'] = FALSE;


問題の設定はここです

$db['default']['pconnect'] = FALSE;
$db['default']['autoinit'] = FALSE;

pconnectがONになっていると、一度接続したコネクションは破棄されず、保持して使いまわします
phpからmysqlに再アクセスする際、高速にアクセスできるのですが
DB側のコネクション数が最大になってしまい、DBにアクセスできなくなっていたというわけです

autoinitは、ライブラリがロードされたときに、データベースに自動的に接続するかどうか。もし FALSE に設定された場合、最初のクエリの実行の前に接続されます

ちなみに、CodeIgniterの初期設定ではこれらがONになっています
かならずOFFにするようにしましょう