Salve a tutti. Sono veramente disperato. Sono 4 giorni che ci sbatto la testa ma non riesco a venirne a capo. Non sapendo se il problema è dovuto lato client o server, provo a postare quì.
Questo lo script lato client:
jQuery( function(){
if(jQuery.cookie('enable-chat')) {
function user_longpolling(){
var t;
jQuery.ajax({
url: 'php/chat/stream_users.php',
type: 'GET',
dataType: 'json',
success: function( payload ){
clearInterval( t );
if( payload.status == 'results' || payload.status == 'no-results' ){
t=setTimeout( function(){
user_longpolling();
}, 1000 );
if( payload.status == 'results' ){
jQuery.each( payload.data, function(i,msg){
//jQuery( '.onlineusers ul li#u-'+ msg.id_user +'' ).removeClass('on');
jQuery( 'li#u-'+ msg.id_user +'').addClass(msg.stato);
});
}
} else if( payload.status == 'error' ){
alert('Sono confuso, cortesemente ricarica la pagina!');
}
},
error: function(){
clearInterval( t );
t=setTimeout( function(){
user_longpolling();
}, 15000 );
}
});
}
user_longpolling();
}
});
e questo lato server:
<?php
require_once('global.php');
require_once('../functions.php');
sec_session_start();
$id_user = $_SESSION['user_id'];
// crea connessione
$conn = mysqli_connect($hostname_alliance, $username_alliance, $password_alliance, $database_alliance);
// verifica connessione
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$time_wasted = 0;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//verifico se l'utente è già nella tabella
$sql = "SELECT * FROM users_online where userid = ".$id_user."";
$result = $conn->query($sql);
//se è stato già inserito aggiorno l'ora
$time = time()+30;
if ($result->num_rows > 0) {
$sql = "UPDATE users_online SET timestamp = ".$time." WHERE userid = ".$id_user."";
}else{
//altrimenti lo inserisco nella tabella ed inserisco l'ora
$sql = "INSERT INTO users_online (userid, timestamp)
VALUES (".$id_user.", ".$time.")";
}
//eseguo la query
$conn->query($sql);
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$old_users_check = mysql_query("SELECT * FROM users_online WHERE timestamp < ".time()." AND stato = 'on' AND userid <> ".$id_user." ORDER BY userid DESC");
$new_users_check = mysql_query("SELECT * FROM users_online WHERE timestamp >= ".time()." AND stato = 'off' AND userid <> ".$id_user." ORDER BY userid DESC");
$num_rows_old = mysql_num_rows( $old_users_check );
$num_rows = mysql_num_rows( $new_users_check );
//se la prima query non mi da risultati
if( $num_rows <= 0 && $num_rows_old <= 0 ){
//inizio il ciclo se non ottengo risultati
while( $num_rows <= 0 && $num_rows_old <= 0 ){
if( $num_rows <= 0 && $num_rows_old <= 0 ){
// dopo 19 secondi invio una nuova richiesta
if( $time_wasted >= 29 ){
die( json_encode( array( 'status' => 'no-results' ) ) );
exit;
}
sleep( 1 );
$old_users_check = mysql_query("SELECT * FROM users_online WHERE timestamp < ".time()." AND stato = 'on' AND userid <> ".$id_user." ORDER BY userid DESC");
$new_users_check = mysql_query("SELECT * FROM users_online WHERE timestamp >= ".time()." AND stato = 'off' AND userid <> ".$id_user." ORDER BY userid DESC");
$num_rows_old = mysql_num_rows( $old_users_check );
$num_rows = mysql_num_rows( $new_users_check );
$time_wasted += 1;
}
}
}
$new_user = array();
if( $num_rows_old >= 1):
while ( $row = mysql_fetch_array( $old_users_check, MYSQL_ASSOC ) ):
$new_user[] = array(
'id_user' => $row['userid'],
'stato' => $row['stato']
);
endwhile;
mysql_query("UPDATE users_online SET stato = 'off ' WHERE timestamp < ".time()." AND stato = 'on' AND userid <> ".$id_user."");
endif;
if( $num_rows >= 1):
while ( $row = mysql_fetch_array( $new_users_check, MYSQL_ASSOC ) ):
$new_user[] = array(
'id_user' => $row['userid'],
'stato' => $row['stato']
);
endwhile;
mysql_query("UPDATE users_online SET stato = 'on ' WHERE timestamp >= ".time()." AND stato = 'off' AND userid <> ".$id_user."");
endif;
mysql_free_result($old_users_check);
mysql_free_result($new_users_check);
die( json_encode( array( 'status' => 'results', 'data' => $new_user ) ) );
Le conseguenze sono drastiche. In effetti, verificando da console, alla prima richiesta inviata dal client, tutto procede regolarmente, ma appena parte la seconda chiamata, non mi permette più di interagire con il server fino all'ottenimento di una risposta. In sostanza, se invio un nuovo messaggio, rimane in sospeso finchè stream_users.php non esce dal ciclo. Non so se l'errore è causato dal client o dal server. Confido nel vostro aiuto