J2EE コンテナーのように PHP を使用する場合、データベース接続をキャッシュすることは可能ですか? もしそうなら、どのように?
8 に答える
PHPにはコネクションプーリングがありません。
mysql_pconnectと接続プーリングは 2 つの異なるものです。接続プーリングには多くの問題がありmysql_pconnect
、まずマニュアルを読んで慎重に使用する必要がありますが、これは接続プーリングではありません。
接続プーリングは、アプリケーション サーバーが接続を管理する手法です。アプリケーションが接続を必要とする場合、アプリケーション サーバーに要求し、アプリケーション サーバーはプールされた接続の 1 つを返します。
PHP で接続スケーリングを行うことができます。そのためには、次のリンクを参照してください。
そのため、php には接続プーリングがありません。
Julio が言ったように、現在のリクエストのリクエストが終了すると、apache はすべてのリソースを解放します。mysql_pconnect を使用できますが、その機能には制限があり、十分に注意する必要があります。他の選択肢は、シングルトン パターンを使用することですが、これはプーリングではありません。
これは良い記事です: https://blogs.oracle.com/opal/highly-scalable-connection-pooling-in-php
永続的な接続は、接続プーリングとは異なります。PHP の永続的な接続は、同じリクエスト/スクリプト実行コンテキスト内で複数のデータベース接続を行う場合にのみ再利用されます。ほとんどの典型的な Web 開発シナリオでは、mysql_pconnect を使用すると、スクリプトが次の要求で開いている接続への参照を取得する方法がないため、接続をより速く最大化できます。PHP で db 接続を使用する最良の方法は、スクリプト実行のコンテキスト内で接続が再利用されるように、db オブジェクトのシングルトン インスタンスを作成することです。これでもリクエストごとに少なくとも 1 つの db 接続が発生しますが、リクエストごとに複数の db 接続を作成するよりはましです。
php の性質上、php には実際のデータベース接続プールはありません。Php は、少なくとも何らかの大規模なハッキングがなければ、リクエストの間にそこに座って、開いている接続のプールへの参照を管理できるアプリケーション サーバーではありません。理論的には、php でアプリ サーバーを作成し、それをコマンドライン スクリプトとして実行して、バックグラウンドで待機し、多数の db 接続を開いたままにし、それらへの参照を他のスクリプトに渡すことができると思いますが、私はそうしません。それが実際に可能かどうか、コマンドライン スクリプトから他のスクリプトへの参照をどのように渡すかを知っています。とにかく、それはほとんど憶測です。php などの prefork サーバーの接続プールを許可するために、他の誰かが apache モジュールに投稿したリンクに気付きました。 https://github.com/junamai2000/mod_namy_pool#readme
mod_php を使用していると思いますよね?
PHP ファイルの実行が終了すると、すべての状態が強制終了されるため、(PHP コードで) 接続プールを行う方法はありません。代わりに、拡張機能に依存する必要があります。
mysql_pconnectを使用すると、ページが終了した後に接続が閉じられないようにすることができます。これにより、次のリクエストで接続が再利用されます。
これで十分かもしれませんが、開いたままにしておく接続の数を指定する方法がないため、これは接続プーリングと同じではありません。
MySQLiを使用できます。
詳細については、下にスクロールして接続プーリングセクション @ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622を参照してください。
接続プーリングは、サーバー (つまり Apache httpd) とその構成にも依存することに注意してください。
接続プールを手動でインスタンス化することはできません。
ただし、 mysql_pconnect関数で「組み込み」の接続プールを使用できます。