PHP 5.3 以降、mysqli 拡張モジュールで持続的接続がサポートされるようになりました。 PDO MYSQL や ext/mysql では以前からサポートされていました。 持続的接続とは、クライアントプロセスとデータベースとの間の接続を 何度も作っては破棄するかわりにクライアントプロセス側で再利用しようというものです。 これにより、必要なときに毎回新規接続を作成するというオーバーヘッドが軽減でき、 未使用の接続はキャッシュされて再利用できるようになります。
他の mysql 用拡張モジュールとは異なり、mysqli には持続的接続のオープン専用の関数はありません。 持続的な接続をオープンするには、接続時にホスト名の前に p: をつけなければなりません。
持続的接続の問題は、予期せぬ状態でクライアント側に残ってしまう可能性があるということです。 たとえば、テーブルロックを行った状態でクライアントが突然終了してしまったとしましょう。 新しいクライアントプロセスがこの持続的接続を使用する際には、 "そのまま" の状態でこれを使うことになります。 新しいクライアントプロセスがこの持続的接続をきちんと使うためには事前になんらかの後始末が必要となります。 これはプログラマにとっては面倒な作業です。
しかし、mysqli 拡張モジュールの持続的接続には後始末を行うコードが組み込まれています。 mysqli は、以下のような後始末を行います。
アクティブなトランザクションのロールバック
一時テーブルを閉じて drop
テーブルロックの解除
セッション変数の初期化
プリペアドステートメントを閉じる (PHP では常に発生)
ハンドラを閉じる
GET_LOCK() で取得したロックの開放
これにより、コネクションプールから取得する接続がクリーンな状態であることが確実になり、 そのままクライアントプロセスで使用できるようになります。
mysqli 拡張モジュールのクリーンアップ処理は、 C の API 関数 mysql_change_user() を自動的にコールすることで行っています。
しかし、自動クリーンアップ処理にはいい面もあれば悪い面もあります。 利点としては、プログラマがクリーンアップのコードを書くことを気にせずにすむということがあります。 自動的にコールされるからです。しかし、多少動作が遅くなるという 可能性 もあります。 接続がコネクションプールに戻される際に毎回クリーンアップが必要となるからです。
自動クリーンアップのコードを無効にしたい場合は、
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
を define して PHP をコンパイルします。
注意:
mysqli 拡張モジュールは、 MySQL Native Drive あるいは MySQL Client Library のどちらを使っている場合でも持続的接続をサポートします。