Система чата в php с длинным пулом, как отправить и получить сообщение вместе без такой большой задержки
Яm currently developing a chat aplication in php to a client using long polling. When the user send msgs i woud .abort() the getmsg() function and restart in on sendmsg() sucess (ajax call), but if the user send repeatedly msgs, the getmsg() get fired multiple times with same parameters, and if the other user is sending msgs too, i got repeatedly the same msgs.
I got a way around it, without .abort() the getmsg() in sendmsg() it works well (ajax take care of both calls).
But when the user send repeatedly msgs, i need to wait in the sleep() loop (getmsg()) to get all the msgs, even if there only a word in each. Is there a way to make the abort() fire just one time on consecutive msgs, or how i could make the sleep() to go lower (less seconds) when it finds a message? Wouldt it take so much of the server to do this check everytime?
Thank
заранее, извините за слишком длинный текст. Вот функции:
PHP
getmsg() (a php file, this is the function)
$aa = mysql_num_rows($chatresult);
$togetmsg = 2;
while($aa == 0 && $tried_times < 6) {
sleep($togetmsg);
$chatresult = mysql_query("query");
$aa = mysql_num_rows($chatresult);
$tried_times++;
}
while($crow = mysql_fetch_assoc($chatresult))
{
get the messages and put in a var/array;
}
json_encode the msgs
sendmsg ()
Just a query to insert the textarea value in the table.
JAVASCRIPT
getmsg ():
jack = $.ajax({
type: "POST",
url: "getmsg.php",
data: {friend_chatid: friend_chatid, msg_id: msg_id},
dataType: 'json',
context: this,
async: true,
cache: false,
timeout:30000,
success: function(html){
$(this).find(".div").append(message);
msg_id = 0;
var _this = $(this);
setTimeout(
getmsg, /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
if(textStatus==="abort" || errorThrown==="abort") {
// alert(textStatus);
} else {
setTimeout(
getmsg,
3000);
}
}
});
SENDMSG ()
$.ajax({
type: "POST",
url: "sendmsg.php",
data: {msg: msg, to: to},
context: this,
cache: false,
beforeSend: function () {
// jack.abort(); // Commented cause i`m not using it now
$(this).val('');
$(".div").append(msg); //
},
success: function(html){
// getmsg(); // Commented cause i`m not using it now
}
});
Он возобновлен, я убираю добавляемую часть данных, чтобы было удобнее читать. Sendmsg () в javascript добавляет значение чата textarea в чат, и они отправляют его в базу данных с php, когда пользователь нажимает ввод, и текстовое поле textarea имеет текст (я убираю эту часть для лучшего чтения). Getmsg () запускает цикл while, проверяя, существуют ли существующие сообщения с помощью mysql_num_rows, и выдает их обратно, если таковые имеются.
1 ответ
Я думаю, что это можно исправить с помощью clearTimeout
, Просто попробуйте этот код.
функция sendmsg()
// define a variable named `pollQueue` outsode of your function
var pollQueue = false;
// send message
$.ajax({
type: "POST",
url: "sendmsg.php",
data: { msg : msg, to : to },
context: this,
cache: false,
beforeSend: function() {
// Check if getmsg is in queue
if ( pollQueue ) {
// if so clear the queue
clearTimeout( pollQueue );
}
if ( jack ) {
jack.abort();
}
$(this).val('');
$(".div").append( msg );
},
success: function( html ) {
// add to queue
pollQueue = setTimeout( getmsg, 3000 );
}
});