0

データベースから最新のデータを取得するために、サーバーページが5秒ごとに呼び出されるajaxアプリケーションを開発しました。

応答を取得するために5秒ごとにserver.php自分のページから呼び出しているとしましょう。client.htmlこれはclient.htmlのサンプルコードです:

$(document).ready(function() {  
refresh_msg();
});

function refresh_msg()
{
setTimeout(update_msg, 5000);
}

function update_msg()
{
var url = "server.php";
var params = "task=update&id=12";

http.open("POST", url, true);           
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        var resp = http.responseText;
        }
}
http.send(params);

setTimeout(update_msg, 5000);
}

これでserver.phpファイルに、データベースファイル(database.php)を含め、クライアント要求を処理しています。これはサンプルコードです:

<?php
include_once 'database.php';

if(isset($_POST['task']) && isset($_POST['id']))
{
$sql = "select message from user_messages where id='".$_POST['id']."'";
$res = mysql_query($sql);
// send response
}
?>

そして最後に、これは私のdatabase.phpファイルであり、データベース接続の詳細が含まれています。

<?php
mysql_connect("localhost:3306","root","root");
mysql_select_db("my_database");
?>

ここで問題となるのは、5秒ごとに新しいmysql接続が作成されることです(MysqlAdministrator>サーバー接続で多くの接続が作成されるのがわかります)。

データベースをクエリするのに最適な方法ではないと思います。代わりに、1つのmysql接続を使用して、クライアントからの後続のすべてのajaxリクエストに使用できますか?

4

2 に答える 2

1

データベースサーバーがWebサーバーと同じマシン上にある場合、各要求で新しい接続を作成する際のオーバーヘッドの量は実際には非常に最小限です。単純なユースケースの大部分では、リクエストごとにデータベースへの新しい接続を作成することはおそらく問題ありません。データベースサーバーがビジー状態である場合は、接続が開いたり閉じたりするためではなく、アプリケーションの設計に関係している可能性があります(より良い解決策については以下を参照してください)。

その答えが単に受け入れられない場合は、代わりに永続データベース接続を使用して調べることができます。最も人気のあるWebサーバーの1つであるApacheを使用した一般的な例では、次の2つのケースがあります。

  1. 標準接続。Apacheの親プロセスは、要求を処理するために使用されるいくつかのワーカープロセス(Apacheの構成で定義されている)を作成します。PHPファイルが要求された場合、PHPインタープリターのインスタンスがそのワーカープロセスで作成されます。さらに、PHPファイルの解釈中にMySQL接続が要求された場合、データベースへの接続が確立されます。スクリプトの実行が完了すると、データベースへの接続が閉じられます。

  2. 持続的接続。上記のすべては、1つの違いを除いて当てはまります。つまり、PHPスクリプトの実行が完了すると、そのApacheプロセスからデータベースへの接続は閉じられません。次に、そのワーカーによって処理される次の要求が同じデータベース接続(つまり、同じホスト上の同じユーザー/パスワードを使用した同じデータベースへの接続)を要求した場合、以前に使用された接続が再利用されます。

持続的接続がパフォーマンスに実際に影響を与えるかどうかは、Webサーバーの容量と構成から、アプリケーションの設計とデータベース構造に至るまで、多くの要因に依存します。

より良い解決策:

一般的に言って、持続的接続はおそらく必要ありません。ポーリング(X秒ごとにチェックするプロセス)が原因でデータベースがビジー状態であると感じた場合は、キャッシュレイヤーを実装し、データベースへのアクセスを完全に排除することをお勧めします。

ユーザー間メッセージングアプリケーションがあるとすると、次のような基本的なキャッシュロジックを記述できます。

  1. ユーザーのページが最初にリクエストしたときに、メッセージをクエリして、最新(またはその他)をmemcachedなどのキャッシュに入れます。
  2. ユーザーがポーリングするたびに、値がキャッシュにあるかどうかを確認してください。もしそうなら、変化はありません
  3. ユーザーが別のユーザーにメッセージを送信するたびに、受信ユーザーの最後のメッセージをキャッシュから削除します
  4. 次回受信ユーザーがサーバーをポーリングすると、メッセージが表示されないことがわかり、データベースに戻って最新の値を確認します。

数秒ごとにデータベースを直接ポーリングすると、通常、アプリケーションの拡張性が低下します。

于 2012-05-31T07:57:13.717 に答える
0

接続プールがあなたの答えになります。私はPHPの専門家ではありませんが、接続プールの方法を示すGoogleで何も見つかりませんでした。

詳細については、このSOの質問をお読みください。PHPでの接続プール

お役に立てば幸いです。

于 2012-05-31T07:56:13.170 に答える