Long polling per verificare gli utenti on line

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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, la function non dovrebbe essere all'interno della if ma esterna a tutto.
Ma non mi è molto chiara la situazione.
 
Discussioni simili
Autore Titolo Forum Risposte Data
F problema loop (long-polling) PHP 0
V HTTP Long polling Ajax 7
X AJAX Long Polling Ajax 1
Z Tool per trovare Long Tail SEO e Posizionamento 0
K Gestione ricezione dati da socket e polling PHP 15
P SOS: polling con ajax Ajax 1
L Script per convertire numeri in parole Javascript 0
J [Cerco] [Collaborazione gratuita] Grafico per piccoli lavori di grafica Offerte e Richieste di Lavoro e/o Collaborazione 0
N Memorizzazione temi per le diverse pagine del sito Javascript 1
otto9due Proteggere file caricati dall'esterno ma renderli accessibili per gli utenti loggati. PHP 4
E Consigli per hosting reseller Hosting 0
T aiuto per trasformare un quiz fatto in JS in un quiz in JQUERY jQuery 0
F Cerco fotografo per sito abiti da sposa Discussioni Varie 1
R [cerco][retribuito] Collaborazione per creazioni loghi ed altro Offerte e Richieste di Lavoro e/o Collaborazione 0
M Unire 2 funzioni per l'invio di un form e con l'apertura di un div Javascript 0
seranto Blocco preventivo e Registro dei Consensi per Cookie tecnici? Leggi, Normative e Fisco 2
D Come estendere la tariffa per Wordpress con Visa? Hosting 1
M Fullcalendar in Codeigniter, un aiuto per la chiamata $ajax ? jQuery 0
N Consigli SEO per il mio sito di web design SEO e Posizionamento 0
P Proiezione di Gauss per grafica su sfera in PVC Photoshop 0
M Sintassi "personalizzata" per mysql workbench? MySQL 0
MarcoGrazia Categorie per settore merceologico di Google SEO e Posizionamento 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
matteoraggi Local seo per un B&B di Forli SEO e Posizionamento 3
D Ical: Sto realizzando un gestionale per i miei appartamenti di casa vacanza PHP 0
S Teams software per i meeting Windows e Software 0
N Non Autorizzato. Dovresti rimuovere il parametro customize_messenger_channel per visualizzare l'anteprima in frontend. WordPress 1
P Aiuto per rendere un Bot Telegram Privato PHP 1
V Query per una somma PHP 2
A Tabella con bottoni per aggiornamento record PHP 6
G Consigli SEO per scrittura e struttura pagine SEO e Posizionamento 8
P Passare solo alcuni parametri a script per CSV PHP 0
A Consiglio per creazione sito web CMS (Content Management System) 1
A Regex per isolare link interni con rel noopener PHP 0
L form immagini per il database PHP 0
S CREAZIONE DI SITO PER CORSI DI FORMAZIONE WordPress 3
I [cerchiamo][retribuito] Grafico/a per stickers Offerte e Richieste di Lavoro e/o Collaborazione 0
R Cercarsi programmatore per GDR PBC Offerte e Richieste di Lavoro e/o Collaborazione 0
L Sessione e array per utenti PHP 0
A Sottoquery con group by per mese MySQL 0
G Appicazione HTML per inserimento dai in Database Access Microsoft HTML e CSS 0
V [Cerco] Socio e Sviluppatore per App PlacesFinder Offerte e Richieste di Lavoro e/o Collaborazione 0
M user agent per il download di api PHP 0
B Stringa sql per ricerca su più campi Database 1
Cosina Upload multiplo con invio allegati per email PHP 0
P Editor per la realizzazione di siti HTML e CSS 2
M Versione nativa per M1. Photoshop 1
A Aiuto per pagina php PHP 0
M [Cerco] aiutanti per creare sito Offerte e Richieste di Lavoro e/o Collaborazione 8
T [cerco] scrittore/scrittrice per articoli web Offerte e Richieste di Lavoro e/o Collaborazione 6

Discussioni simili