Long polling per verificare gli utenti on line

  • Creatore Discussione Creatore Discussione maliba
  • Data di inizio Data di inizio

maliba

Nuovo Utente
9 Apr 2013
6
0
1
Salve a tutti. Sono veramente disperato. Sono 4 giorni che ci sbatto la testa ma non riesco a venirne a capo.

Questo lo script lato client:

Codice:
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:

Codice:
<?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
 
Ciao, la function non dovrebbe essere all'interno della if ma esterna a tutto.
Ma non mi è molto chiara la situazione.
 

Discussioni simili