2016-04-23 10 views
4

私は、PHPが自動的に開いているMySQL接続をスクリプトの最後で閉じることを知っています。永続的な接続を開く唯一の実行可能な方法は適切なPHP関数を使うことです。多くの質問が尋ねられ、答えられました。または不便 - - 私が知りたいのは、利益ある持続的な接続

EDITのではなく、一時的な接続を維持する: 各PHPのユーザーセッションの永続的な接続。例えば
、次のような文:PHPはスクリプトの最後で自動的に接続を終了します

session_start(); 
$connection = new mysqli($host, $user, $pass, $db); 
$_SESSION['connection'] = $connection; 

は、同じユーザーが同じセッション内のウェブサイトナビゲーションを横切って複数のクエリを実行するのに有用なmysqliのオブジェクトへの参照を設定するかもしれません。

接続をアクティブ化した直後に使用することになっている場合、それ以降のクエリ用に接続を開いたままにすることは適切な選択ではありませんか?たぶん、このアプローチは、複数のユーザーがMySQL接続を維持しているWebサイトからのHTTP要求ページである場合に、不都合な状況(およびセキュリティリスクの可能性)を引き起こす可能性があります。 私はもっと知りたいです。ありがとうございました。

+1

私はまた、各要求はPHPのための新しいライフサイクルで質問 – Webeng

+0

をupvotedあなたが他の場所で得ることができますように、それは永続的な状態を持っていない、これはパフォーマンスおよびセキュリティ:)に影響を与える方法を知っていただきたいと思います。あなたは、あなたが「最後に挿入ID」を取得し、(クエリが最初仕上げ)競合状態が表示される場合がありますたい、複数の要求/ユーザーに対して同じ接続を使用した場合それは不可能です、あなたに別のユーザーが挿入されているIDなど – JimL

+0

を与えるかもしれませんセッションにシリアル化(mysqli接続を保存)するので、サンプルコードは期待どおりに動作しません。 – drew010

答えて

2

通常は大規模ではありませんが、MySQLやデータベースに接続するためのオーバーヘッドがあります。このオーバーヘッドは、MySQLサービスが別のサーバー上で実行されている場合、または認証方法と必要なinitコマンドによってより大きくなります。

さらに、MySQL接続にはキャッシュが関連付けられている場合があります。したがって、接続を再利用すると、これらのキャッシュを再利用できる可能性があります。

ただし、セッションでリソースを保存しても機能しません。セッションデータは、シリアル化され、例えば、リクエスト間のファイルそのため、永続的な接続メソッドを使用する必要があります。

接続が最終的にリソースまたは内部クラスのソケット接続であり、特別な処理をせずに「保存」できないためです。それを試してみてください、そして、あなたがエラーを取得していることがわかります(PDOとmysqliので。)

mysqli::query(): Couldn't fetch mysqli

私が実装する拡張機能を記述することなく、セッション固有の接続の再利用を取得する方法はないと思いますそれ。理論的には可能ですが、理論的にはプールからのセッションをセッションIDでプルする方法を実装できます。

永続的なDB接続に潜在的な欠点とリスクの多くは、しかし、があります。

  1. アプリケーションが一時テーブルを作成する場合、それは同じMySQLのセッションなので、これらのテーブルはまだ、次の実行上に存在します。

  2. 変数(SET SESSIONなど)を設定すると、それらは保持されます。

  3. トランザクションの処理方法によっては、持続的な接続で進行中のトランザクションが発生する可能性が理論的にあります。

  4. アプリケーションがLOCKコマンドを発行するか、ユーザーロックを使用すると、ロックは要求間で保持され、知らないうちに新しい要求で保持される可能性があります。マルチテナント(共有)ウェブサーバ上

  5. 、それが持つべきではない何とかデータベースへのアクセスを得る別のプロセスの危険性が高くなります。

  6. これは、データベース・サーバー上のリソース使用量の増加、長時間のオープン多数の接続を残すことができます。

  7. は、あなたはまだ、接続が要求間で失われる可能性があることを期待しなければなりません。

関連する問題