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
felino Lubuntu 18.04 Requisiti per applicazione console .net core 7.0 Linux e Software 0
M pulsante per aprire una maschera che contiene controllo schede MS Access 0
E Aiuto per query PHP 8
E Il punto di riferimento italiano per Trailers cavalli Discussioni Varie 0
F CERCO Servizi SEO di Qualità per Agenzie di Servizi SEO e Posizionamento 3
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
A Cerco programmatore/sviluppatore per creare forum Offerte e Richieste di Lavoro e/o Collaborazione 2
R Plugin di base per WordPress WordPress 0
D [COMPRO/CERCO] GUEST POST o scambio link per sito di Spiritualità ed Esoterismo. Vendere e Acquistare pubblicita' online 0
L Suggerimento Pagespeed per non vedenti HTML e CSS 0
M Analisi sito per pulire codice inutile HTML e CSS 1
Paolo69 Risolto reCAPTCHA v2 per ASP Classic ASP 0
M Hosting VPS per server di gioco Minecraft Hosting 0
N Grazie per il benvenuto Presentati al Forum 0
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
R Filtri e plugin per photoshop Photoshop 0
AkTaRuS DIsabilitare il tasto destro tranne che per code e pre Javascript 1
0 [Retribuito] Cercasi programmatore per GdR PbC Offerte e Richieste di Lavoro e/o Collaborazione 0
A Adempimenti per magazine on line Leggi, Normative e Fisco 0
R Recupero di permalink di un sito che è stato eliminato per errore WordPress 5
I aiuto urgente per thunderbird Posta Elettronica 0
A Web master per semplice sito web Offerte e Richieste di Lavoro e/o Collaborazione 2
M [Cerco][Gratuito] Artista/designer per creazione grafica gioco di società Offerte e Richieste di Lavoro e/o Collaborazione 0
M Un saluto per cominciare Presentati al Forum 1
N MAX() + ADD_DATE - per update su Mysql MySQL 0
G Qualcuno conosce questo software per gestire le telecamere IP Cam e Videosorveglianza 0
A [CERCO] Articolista per siti a tema eventi e feste private Offerte e Richieste di Lavoro e/o Collaborazione 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
I aiuto per outlook Posta Elettronica 0
L Script per convertire numeri in parole Javascript 2
J [Cerco] [Collaborazione gratuita] Grafico per piccoli lavori di grafica Offerte e Richieste di Lavoro e/o Collaborazione 0
M 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 2
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

Discussioni simili