web-dev-qa-db-ja.com

CodeIgniterデータベース接続が閉じられていません

CodeIgniterでソーシャルコミュニティのウェブサイトを構築しましたが、現在かなりのトラフィックを獲得しています。ホスティング会社は、データベースがnull接続および閉じられていない接続を受信して​​いると不満を述べ始めました。

Nullクエリとは何か、どのように発行されるのか、完全にはわかりません。

コードが最後に到達したときに接続を強制的に閉じるようにコードを追加しましたが、どうやらこれは機能していません。

このような問題のどこを調べたり、デバッグを開始したりするための提案を誰かが提供できますか?

ありがとう

コアの下部に次のものがありますMY_Controller

public function __destruct() {
    $this->db->close();
}
24
ArthurGuy

Codeigniter接続データベースの初期設定で問題が発生していると思います。

このページでは、構成配列の各値を確認できます。
https://www.codeigniter.com/user_guide/database/configuration.html

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$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'] = TRUE;
$db['default']['stricton'] = FALSE;

これは基本的な配列構成データベースです。pconnectの変数をFALSEに設定してみてください。オンにすると、システムは接続を閉じず、いつでもニュースクエリに対して開かれたままになります。

私が言ったようにfalseに設定すると、システムは完全に動作し続けますが、データベースを使用する必要がある場合、codeigniterは接続を閉じて開きます。

ここでは、pconnect変数に問題がある人とcodeigniterフォーラム内を見つけて投稿できます。 http://codeigniter.com/forums/viewthread/177573/#842016

27
Wallysson Nunes

Codeigniterはデータベース接続を自動的に閉じる必要がありますが、$this->db->close();で暗黙的に呼び出すことができます

http://codeigniter.com/user_guide/database/connecting.html を参照してください

6
simnom

クエリが行われた後に$this->db->close();を実行しようとしましたか?

2
Marco Monteiro

私は過去にCodeIgniterで同様の問題を抱えていましたが、それらはMySQLの永続的な接続が原因で発生しました。これは、CodeIgniterでデフォルトで有効になっています。 MySQLでSHOW PROCESSLISTクエリを使用して、開いている接続、それらの現在実行中のクエリ、接続が開いている時間(秒単位)などを表示しました。接続がアイドル状態の場合、Commandフィールドが返されますSleepが含まれ、Infoフィールド(クエリ)はNULLになります。これは、おそらくホストが参照しているものです。これは、このような問題から始めるのに適した場所です。

もう1つ注意したいのは、コントローラのmysql_closeメソッドから呼び出される here と呼ばれるPHPのニュアンス__destructは、永続的なMySQL接続を閉じないことです。 PHPは、スクリプトの実行の最後に非永続的な接続を閉じるため、通常は呼び出す必要はありません。

永続的な接続が有効になっていないとおっしゃっていたようですが、これが私の問題をデバッグする方法であり、問​​題とよく似ています。

1
Matt Barry

Database.phpでドライバー「mysql」を「mysqli」に変更することにより、1つのCIサイトで同じ問題を解決しました。

$db['default']['dbdriver'] = "mysqli";
0
blagi

しばらく前に同じ問題がありましたが、解決策はマルチパートでした(すべての部分が一緒に問題になるまで、問題の単一の部分は表面化しませんでした)。 (他の人が言ったように)それを使用する方法を知らない限り、PConnectはオフであるべきです。

考慮すべきもう1つのことは、Webサーバーがスレッド化されているかどうかです(Apacheのワーカーモードなど、最も一般的なWebサーバーはスレッド化されています)。トラフィックが多く、スレッドがすぐに閉じない場合は、Webサーバー/データベースサーバーの同時接続の制限に達しているか、メモリ/プロセッサリソースを使い果たしている可能性があります。これにより、一部のデータベース接続がハングする可能性があります。

したがって、私は問題の他の兆候をチェックし、データベースがソースであるとは想定しません。症状かもしれません。 null接続に関する情報(どのデータベースユーザーがそれらを生成したかなど)がありますか?それはあなたがそれをさかのぼることを助けるかもしれません...

編集:忘れてしまったことがあります-PHPエラーにより、CIの破棄操作が失敗する可能性があります(私の理解から、接続が自動的に閉じられます)。エラーログも。

0
landons