Sto cercando di creare una sorta di chattina in long polling, però il CloadFlare un pò mi da problemi per tutte le chiamate che fa: per tanto vi vorrei chiedere se i miei codici sono da ottimizzare, vi passo le due funzioni dove faccio le richieste più pesanti: Online() (aggiorna gli utenti online) e Euphoria() (aggiorna la chat con un nuovo messaggio)
CLIENT:
script client che fa richieste longPolling json al file requests.php:
###PS: ho oscurato le funzioni cun cui creo gli elementi nel doom, perché futili al problema
Codice PHP:
<script>
function Online(content){
var data = null;
if(content == null) data = {<?=REQUEST_TYPE?>:'getPollOnline'};
else data = {<?=REQUEST_TYPE?>:'getPollOnline','content' : content};
$.ajax({
url:"requests",
method:"post",
dataType:"json",
data:data,
success:function(data){
makeOnlineList(data["users"]); //aggiorna gli utenti online
online_update++;
Online(data);
},
error:function(){
return;
}
});
}
function Euphoria(id){
var data = null;
if(id == null) data = {<?=REQUEST_TYPE?>:'getPoll'};
else data = {<?=REQUEST_TYPE?>:'getPoll','id' : id};
$.ajax({
url:"requests",
method:"post",
dataType:"json",
data:data,
success:function(data){
addNewMessage(data,false); //aggiunge il nuovo messaggio ala chat
last_update++;
Euphoria(data.id);
},
error:function(){
return;
}
});
}
//variabili per accendere o no delle funzioni nel setInterval sotto
var current_update,current_online_update = 0;
var last_update,online_update = 0;
jQuery(function($) {
//EuphoriaAll(null,true); //questa funzione è per mostrare tutti i messaggi all'inizio però non è completa
Euphoria(); //questa funzione se comprendo che il database è cambiato, aggiorno la chat
Online(); //stessa roba per la chat ma per gli utenti online
//questo setInterval gira ogni minuto e riaccende una data funzione nel caso il server non fosse più attivo
setInterval(function(){
if(last_update > current_update && $.active > 0){
current = last_update;
Euphoria();
//Online();
}
else if(online_update > current_online_update && $.active > 0){
// Euphoria();
Online();
}
},60000);
//qua mostro solo se uno sta digitando o no
//al keydown aziona, nel keyup se si sta digitando toglie la digitazione dopo 2s, al blur leva la digitazione
var on_digits = false;
$("#message").keydown(function(){
toggleDigits("visible");
on_digits = true;
}).keyup(function(){
if(on_digits){
setTimeout(function(){
toggleDigits("none");
},2000);
}
}).blur(function(){
toggleDigits("none");
on_digits = false;
});
//sulla testarea invio i dati al form dopo aver premuto enter
$("#message").keydown(function(e){
if(e.keyCode === 13){
if(e.shiftKey) return;
else {
$("form[data='chat']").submit();
}
}
});
$("form[data='chat']").submit(function(e){
e.preventDefault();
var data = $(this).serialize();
data+="&<?=REQUEST_TYPE?>=putMessage";
$.post("requests",data,function(e){
});
$("#message").val("").get(0).setSelectionRange(0,0);
setTimeout(function () { $("#message").val(null); }, 20);
});
});
</script>
File requests delle due richieste:
Codice PHP:
case "getPollOnline": #aggiorna gli online
header("Content-Type: application/json");
set_time_limit(0);
while (true) {
$last_request_content = isset($_REQUEST['content']) ? (object)$_REQUEST['content'] : null;
clearstatcache();
$last_list = ONLINE::getList(time());
//last_list è un oggetto vario contenente anche un array "hash" e calcolo la diversità con quello
if ($last_request_content == null || $last_list["hash"] !== $last_request_content->hash ) {
#CONF::json(...) == json_encode(...)
echo CONF::json($last_list); #qui cedo a client il json della mia lsta
break;
} else {
sleep(1);
continue;
}
}
break;
case "getPoll": #aggiorna la chat con un nuovo messaggio
header("Content-Type: application/json");
set_time_limit(0);
while (true) {
$last_request_id = isset($_REQUEST['id']) ? (int)$_REQUEST['id'] : null;
clearstatcache();
$last_message = CHAT::getLast();
if ($last_request_id == null || $last_message->id > $last_request_id) {
echo CONF::json($last_message);
break;
} else {
sleep(1);
continue;
}
}
break;