7

PHPとMySQL間の永続的なデータベース接続(mysql_connectとmysql_pconnect)についてたくさん読んだことがあります。PDOおよびMySQLiと同じです。これは間違いなく私の理解不足ですが、データベース接続をWebページ間で永続化するにはどうすればよいでしょうか。このコードでは:

$conn = mysql_pconnect( $server , $user, $pass );
mysql_select_db( $dbname );

2人のユーザーが2つの異なる$d​​bname変数を使用してこのページを同時にロードした場合、PHPはデータベースへの接続を1つだけにするのでしょうか、それとも2つだけにするのでしょうか。私はかなり確信しています

$conn = mysql_connect( $server , $user, $pass );

2つの接続を行います。

pconnectが最初のユーザーによって開かれた接続を再利用する場合、mysql_select_db呼び出しは2番目のユーザーに対して機能しますか?

理想的には、私が探しているのは、データベース接続を減らしながら、各PHPスクリプトでデフォルトのデータベースを設定できる方法です。すべて同じPHPスクリプトを使用するクライアントがありますが、データは独自のクライアントデータベースに保存されます(したがって、$ dbnameは常に異なりますが、MySQL接続パラメーターは同じです-同じmysql ipアドレス、ユーザー、およびパスワード)。

それが理にかなっていることを願っています。MySQL、MySQLi、またはPDOを使用できます。クライアントが誤って他の人のデータベースにデータを書き込む可能性がなく、これを最善の方法で実現する方法を知っておく必要があります。前もって感謝します。

4

2 に答える 2

7

永続化は、Webサーバーに埋め込まれているPHPのコピーによって行われます。通常は正しいでしょう-PHPがCGIモードで実行されている場合、要求が実行されてPHPがシャットダウンしたときに永続化するものが何もないため、永続的な接続を確立することは不可能です。

ただし、PHPのコピーがWebサーバーに埋め込まれており、Webサーバー自体が要求間で実行され続けるため、その「永続的な」PHP内で永続的な接続のプールを維持することができます。

ただし、Apacheマルチワーカータイプのサーバーモデルでは、接続プールは子供ごとに維持されることに注意してください。プールの制限を10に設定すると、Apacheの子ごとに10の接続があります。20人の子供=200人の接続。

持続的接続は、デッドロックやその他のデバッグが難しい問題などの長期的な問題にもつながります。覚えておいてください-ユーザーのHTTPリクエストが同じapache子/mysql接続によって処理されるという保証はありません。スクリプトがデータベーストランザクションの途中で停止した場合、MySQLはHTTP側を認識しないため、そのトランザクションはロールバックされません。認識されるのは、mysql <-> apache接続がまだ開いていて、すべてが正常であると想定していることだけです。 。

その特定のapache/mysql子/接続の組み合わせをヒットした次のユーザーは、トランザクションが開いているという手がかりなしに、魔法のようにそのトランザクションの途中で終了します。基本的に、それはフラッシュされていないトイレに相当するWebです-前のユーザーからのすべての「ゴミ」はまだそこにあります。

非持続的接続を使用すると、接続するたびに「クリーンな」環境が保証されます。

于 2012-08-01T17:10:08.403 に答える
6

ドキュメントとコメントを読んだところ、次のことがわかりました。

mysql_pconnectのドキュメント(非推奨のメソッド)

次に、スクリプトの実行が終了しても、SQLサーバーへの接続は閉じられません。代わりに、リンクは将来の使用のために開いたままになります(mysql_close()はmysql_pconnect()によって確立されたリンクを閉じません)。

そしてそのページへのコメント

持続的接続は、モジュールバージョンでのみ機能するという上記の提案とは対照的に、fastCGIによって管理されるCGIPHPで適切に機能します。これは、fastCGIがリクエスト間でPHPプロセスを実行し続けるためです。PHP_FCGI_CHILDREN<<mysqlのmax_connections<<<ApacheのMaxClientsを設定できるため、このモードの持続的接続も接続制限の影響を受けません。これにより、リソースも節約できます。

mysqli_connectのドキュメント(新しいメソッド)

ホストの前にp:を付けると、持続的接続が開きます。mysqli_change_user()は、接続プールから開かれた接続で自動的に呼び出されます。

mysqli_change_userのドキュメント:

指定されたデータベース接続のユーザーを変更し、現在のデータベースを設定します。

したがって、私の理解は次のとおりです。pconnectは、スクリプトが終了した後でも、プロセス(またはプロセスのグループ)がまだ生きている間(FCGIが設定されたサーバーのように)接続を開いたままにします。一度に1つのスクリプトのみが接続を使用し、新しいスクリプトがその接続を取得すると、ユーザーとデータベースが更新されます。

したがって、FCGIと持続的接続を使用する場合、開いているdb接続の数を減らすことができますが、同時に実行されているスクリプトは同じ接続を共有しません。どのデータベースが選択されているかについて、接続が混乱していても問題はありません。

于 2012-08-01T17:03:28.700 に答える