短いポーリング(AJAX更新)を使用した単純なPHPjQueryチャットアプリケーションを作成しました。同様に、2〜3秒ごとに新しいメッセージを要求します。しかし、私は、ロングポーリングがチャットアプリケーションにとってより良いアプローチであることを読みました。それで、私はいくつかのロングポーリングスクリプトを実行しました。私はこのように作りました:
Javascript:
$("#submit").click(function(){
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'}
});
});
var getNewMessage = function() {
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'},
function(data){
alert(data);
}
});
getNewMessage();
}
$(document).ready(getNewMessage);
PHP
<?php
$time = time();
while ((time() - $time) < 25) {
$data = $db->getNewMessage ();
if (!empty ($data)) {
echo json_encode ($data);
break;
}
usleep(1000000); // 1 Second
}
?>
問題は、一度getNewMessage()
起動すると、(chat-handler.phpから)何らかの応答がない限り実行されることです。再帰的に実行されます。しかし、誰かがその間にメッセージを送信したい場合、実際には、その関数はまだ実行($("#submit").click())
されているように実行されることはありませんgetNewMessage()
。それで、回避策はありますか?