1

PHP と ajax を使用してチャットを行い、while ループを使用してデータベースで新しいメッセージをチェックしています。

これは、メッセージを取得するコードです。

//retrive message

function update(){

$(document).ready(function(){

$.ajax({

async: true,

type: "POST",

url: "listen.php",

success: function(data){

$("#myp").before(data);

},

complete: function(){

window.setTimeout("update();",100);
}

});

});

};


//wating for new message

<?php
include_once("connect.php");

$type="";

while($type!=='n'){


usleep(1000);

$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1");

$row=mysql_fetch_assoc($search);

$type=$row['type'];

$id=$row['id'];

}

echo $row['message'] . "<br/>";


mysql_query("UPDATE chat SET type='o' WHERE id=$id");


?>

これで問題なく動作し、php ファイルは新しいメッセージがあるかどうかを常にチェックし、ページが読み込まれると更新機能が開始され、応答を待ちます。しかし、それは効率的ですか?これを Web サイトで使用すると、while ループのためにサーバーに過度の負荷がかかるのではないかと心配しています。whileループをよりサーバーフレンドリーにする方法を知っている人はいますか?

4

1 に答える 1

1

あなたの勘は正しいです。通常のサーバー設定では、1秒あたり100〜1000のPHPリクエストに応答できるため、クライアントごとに1秒あたり10リクエストを実行すると、サーバー上の多くのリソースが消費されます。少数の人にとってはうまくいくかもしれませんが、うまく拡張することはできません。サーバーは、10〜100ユーザーの間で最大になる可能性があります(これはかなり低いです)。

1つの修正は、各サーバーポーリング間の時間を増やすことですが、これは直線的な修正にすぎず、ユーザーのエクスペリエンスを低下させます。

より良い解決策は、彗星アプローチを使用することかもしれません。これを純粋にPHPで行うのは(不可能ではないにしても)難しいため、長いhttpリクエストを処理するには外部APIを処理する必要があります。

于 2010-08-16T03:54:17.390 に答える