Costruire una semplice chat in PHP non è affatto semplice.

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Ciao, devo... cioè dovrei :D costruire una seplice chat in PHP; non voglio prenderne di già pronte perché o troppo semplici al limite dell'insicurezza e del poco utilizzo, ne troppo complesse perché inutili per il mio progetto, così ho deciso di realizzarne una da me, tanto ne ho le competenze... be credevo di averne a sufficienza, ma in realtà non è affatto semplice :crying:

Sto realizzando un sito per un GDR ( Gioco di ruolo ) a fondo perduto, in pratica voglio solo tenermi in esercizio, nessnu problema col sito in se ma mi ci vuole una chat con determinate caratteristiche: in php per essere facilmente integrata all'interno delle pagine, con la possibilità di avere "stanze" e che sia di implementazione semplice e da integrarsi col database che gestisce l'intero gioco.

Detto e non fatto, cioè ho delle idee, alcune le ho messe anche in pratica in qualche prova fatta in locale ma ci sono dei punti che non mi tornano, ad esempio come si fa a leggere il database per inserire nel rullo dei messaggi quelli scritti dagli utenti, valutando solo gli ultimi senza ripetersi?

Avevo pensato ad un loop continuo in cui gli utenti loggati venivano messi in uno stack; i messaggi ovviamente vengono inviati in modo casuale ma vengono messi in coda prima di entrare nel database, uno stack del tipo l'ultimo a entrare aspetta il turno :D
Ma la tecnica è semplice in fondo, l'utente della chat scrive un messaggio che arriva allo stack, da qui viene scritto nel database nel momento che arriva il suo turno, una volta iscritto questo viene mandato anche a tutti i rulli di tutti gli utenti iscritti.
A parole un sistema potrebbe anche funzionare, il database potrebbe sembrare inutile ma serve per avere uno storico dei messaggi.
Ovviamente non parlo dell'implementazione di login e logout perché non è questo il punto.

Voi come fareste?
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Una forma semplificata al massimo è questa, ovviamente è solo un embrione e non funziona nemmeno bene.
Il file client.html
HTML:
<!DOCTYPE html>
<html lang="it">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Chat</title>
</head>
<body>
	<div id="rullo"></div>
	<label for="comandi">Comandi: </label>
	<select id="comandi">
		<option value="0">NULL</option>
		<option value="q">EXIT</option>
	</select>
	<label for="messaggio">Messaggio: </label>
	<input type="text" id="messaggio" value="">&nbsp;
	<input type="button" id="invia" name="invia" value="INVIA">

	<script src="jquery-1.11.3.min.js"></script>
	<script>
		$( '#invia' ).on( 'click', function() {
			var c = $( '#comandi' ).val();
			var m = $( '#messaggio' ).val();
			if ( m != '' ){
				var dati = { 'data': m, 'comandi': c };
				$.getJSON( 'server.php', dati, function( data ){
					var items = [];
					$.each( data, function( key, val ) {
						items.push( "<li id='" + key + "'>" + val + "</li>" );
					});
					$( "<ul/>", {
						"class": "my-new-list",
						html: items.join( "" )
					}).appendTo( '#rullo' );
				});
			}
		});
	</script>
</body>
</html>

Il file server.php
PHP:
<?php
	if ( filter_has_var( INPUT_GET, 'data' ) && filter_has_var( INPUT_GET, 'data' ) != '' ){
		$stop= true;
		$messaggio = filter_input( INPUT_GET, 'data', FILTER_SANITIZE_STRING );
		$comando = filter_input( INPUT_GET, 'comandi', FILTER_SANITIZE_STRING );
		while( $stop ){
			sleep( 1 );
			$msg = array( 'messaggio' => $messaggio );
			if ( $messaggio == '/quit' || $comando == 'q' ) {
				$msg =  array( 'messaggio' => 'utente uscito' );
				$stop = false;
			}
			echo json_encode( $msg );
		}
	}
?>

In realtà se lancio il client e scrivo qualche cosa, il server si attiva ma non ritorna nulla, forse nu problema di polling? Non so, ci ho messo uno sleep di un secondo per rallentare il ciclo ma bo, non funge, invia solo il messaggio di 'utente uscito' se mando il comando di quiet ( q ).
Se richiamo direttamente server.php ( per questo ho usato la GET ) con server.php?data=ciao ovviamente lo schermo mi si riempie di { 'messaggio' : 'ciao' } all'infino, almeno fino a quando o va in crash per esaurimento dello spazio data della memoria assegnata dal server allo script, o do il comando Q a quel punto esce con la scritta 'utente uscito'.

Ora come ora mi basterebbe capire come mai il server non ritorna nulla!

Rettifico parzialmente, come detto prima lo script risponde così, anche se non appare nulla nella casella del rullo:
{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}{"messaggio":"ciao"}<br />
<b>Fatal error</b>: Maximum execution time of 30 seconds exceeded in <b>C:\Apache\users\marco\prova\chatta\server.php</b> on line <b>8</b><br />
Ma è ovvio come ho detto prima, lo spazio script viene chiuso preventivamente prima che vada in crash, la riga 8 è: $msg = array( 'messaggio' => $messaggio ); ma è un punto arbitrario, ovvero quando lo script è stato chiuso si trovava a quel punto.
 

alankanz

Lupacchiotto
Membro dello Staff
MOD
18 Giu 2014
147
5
18
Roma
Ciao MarcoGrazia,

La chat deve essere in tempo reale? cioè quando invio il messaggio arrivi istantaneamente a tutti gli utenti della chat?
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Ciao, perdonatemi se riesumo questo thread, ma come dissi all'inizio, questo non era un lavoro ma un divertessement.
Poi il lavoro, quello vero, mi ha portato altrove; oggi rieccomi qui a rispondere come se il tempo non contasse.
Ebbene sì, multiutenza in tempo reale.
 
Discussioni simili
Autore Titolo Forum Risposte Data
P chi mi aiuta per costruire una finestra overlay ???? Javascript 1
K costruire una tabella dinamicamente con css... HTML e CSS 1
A Come costruire una rendita a Vita! Presenta il tuo Sito 0
Max 1 Guida per costruire un blog con wordPress Altri Annunci 1
S Stringhe: confrontare immissione con stringa d'esempio e costruire stringhe da più campi PHP 10
F Da auto didatta a costruire un sito internet HTML e CSS 32
N costruire la sequenza di chiamate a js Javascript 1
M Costruire un motore di ricerca Programmazione 2
O Hai Sempre Sognato Di Costruire Da Te Il Tuo Futuro Professionale? Altri Annunci 0
S costruire pagine web indifferentemente dalla risoluzione Webdesign e Grafica 4
I Costruire sito che si ridimensiona a tutte le risoluzioni? Webdesign e Grafica 5
rok Come faccio a costruire un menu uguale a questo ? HTML e CSS 7
T Cercasi aiuto x costruire sito sul cinema Altri Annunci 7
T costruire un forum Discussioni Varie 4
P C# Salvare una colonna del DataGridView XML 0
M pulsante per aprire una maschera che contiene controllo schede MS Access 0
M Leggere in un report il valore di una casella combinata di una maschera Database 0
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
S [VB.NET]: Coordinate immagini dentro una PictureBox Visual Basic 0
I stampare una stringa echo PHP 2
MarcoGrazia Riprendere una sessione interrotta PHP 0
L Rendere una parte trasparente Photoshop 3
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
K Visualizzare del html responsive in una Webview Sviluppo app per Android 0
otto9due Ordinare option di una select Javascript 5
N Come si crea una variabile dinamica da incrementare? Javascript 1
L Eliminazione di una pagina dalla gallery SEO e Posizionamento 0
otto9due Proteggere una cartella e file con password tramite .htaccess e .htpasswd Web Server 0
L Riempimento di una tabella al click di un bottone Javascript 1
R Variabile non risconosciuta dentro una funzione PHP 1
C ACCESS Aprire maschera se valore non presente in una combo MS Access 7
A media degli elementi estratti da una query MySQL 0
spider81man Eliminare primo ed ultimo carattere di una colonna MySQL 0
pacemattia408 disattivazione di una function Javascript 4
G Eliminare l'effetto refresh di una pagina internet PHP 8
otto9due Inserire o aggiornare tabella my sql controllando una coppia di valori PHP 7
M Select Option dentro una Table jQuery 2
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
E Scrivere una data corrente in un pdf PHP 1
Sergio Unia Problema con gli eventi del mouse su una data table: Javascript 2
I Assegnare dati fetch request ad una variabile globale Javascript 0
Shyson Puntare ad una sotto directory WordPress 3
Stex1967 Salvare una immagine che si trova su porta TCP 8080 di altro sito PHP 7
S Selezionare ultimo record di una sotto query MySQL 27
V Query per una somma PHP 2
L Mysql: Nascondere le pagine dopo una ricerca PHP 1
L salvare una immagine elaborata in canvas Javascript 1
L salvare una immagine elaborata in canvas Javascript 1
W visualizzare solo file html e sottocartelle di una cartella PHP 1

Discussioni simili