mysql_pconnect は、php と mysql の間の継続的な接続を確立するために使用されます。php の一般的な実行モードでは、スクリプトの実行開始時にすべてのリソースが初期化され、スクリプトの終了後にすべてのリソースが解放されます。 これは、mysql_pconnect の場合には当てはまりません。Mysql_connect は、毎回 tcp または unix domian ソケットを介して SQL サーバーとの関係を再確立します。
pconnect を使用する場合、mysql への接続リクエストがあると、php は同じ接続 (同じユーザー名とパスワードで同じ mysql サーバーに接続) が以前に確立されているかどうかを確認します。確立されている場合は、この接続を直接使用します。同じ接続の概念はプロセスに対するものであることに注意してください。mysql_pconnect を呼び出す異なるプロセスは複数の接続を確立します。
Connect と pconnect には機能的な違いはなく、パフォーマンスの違いのみが生じます。
一般に、php には 2 つの動作モードがあり、1 つは CGI として実行され、もう 1 つは Apache モジュールとして実行されます。 cgi として使用する場合、cgi が実行されるたびにリソースが破棄され、クリーンアップされるため、connect は pconnect と何ら変わりません。
php が Apache モジュールとして実行される場合、データベースへの継続的な接続を使用できますが、潜在的な問題が発生する可能性があります。
mysql サーバーが最大 10 個の同時実行をサポートするように構成されていると仮定します。 また、Apache は 100 個の子プロセスを使用するように構成されています。
Apache は親プロセスを使用して、アイドル状態の子プロセスが処理される受信した http リクエストの分散を調整します。このようにして、10 個の http リクエストがすべて異なる子プロセスに割り当てられると仮定すると、10 個のフォローアップ リクエストが処理されます。 mysql 間の永続的な接続が確立され、mysql の機能が限界に達しました。この時点で、別の http リクエストが到着し、Apache はそれをこれら 10 個のサブプロセスに含まれない他のプロセスに分散します。すると、ピットがいっぱいであるため、このプロセスは mysql への接続を確立できません。
永続的な接続の使用には他にも問題があります。
スクリプトで永続接続を使用し、テーブル ロック操作を実行する場合、スクリプトが終了するまでロックは解除されません。 次にこのスクリプトを実行すると、ロック テーブルを取得するために過去がテーブルのロックを解除するまで無限に待機することになり、これが無限ループになります。 Web サーバーまたは mysql サーバーを再起動しない限り。 ロックの原因となるもう 1 つの原因はトランザクションです。
これを回避するには、 register_shutdown_function を使用してコールバック関数を登録し、テーブル ロックを解放したり、トランザクションをロールバックしたりできます。