Domanda

Diversi visitatori si connettono a http://site.com/chat.php

Ognuno di loro può scrivere e inviare un messaggio di testo a chat.php e questo verrà visualizzato immediatamente sul browser di tutti (http://site.com/chat.php)

Devo utilizzare un database?Voglio dire, le capacità di buffer AJAX o PHP sono sufficienti per una chat room di questo tipo durante le sessioni?

In che modo le sessioni di utenti diversi possono condividere i dati tra loro?

Qualsiasi idea o intuizione sarà apprezzata, grazie!

Modificare:Grazie per i linkMa quello che voglio è il modo di inviare i dati a un browser client.L'aggiornamento costante del browser client (AJAX o meno) è l'unico modo?Anche qui la sfida è come diversi utenti, ad esempio 2, 1 su 1, condividono i testi della chat?Come li conservi?E come sincronizzate i testi tra i 2 client?Preferibilmente non utilizzare un database.

Modifica 2:In realtà YGrida menzionato da Peter D fa questo lavoro abbastanza bene.Non sembra che continui ad aggiornare il browser.Ma non capisco come invii nuovi messaggi alla finestra dell'utente esistente.

È stato utile?

Soluzione

ci sono (approssimativamente) 3 opzioni per creare un'applicazione di chat:

prese

utilizzare flash/Java e socket per il frontend e un linguaggio di programmazione compatibile con socket per il backend.per il backend, consiglierei Java o Python, perché sono multithreading e compatibili con NIO.è possibile farlo con PHP (ma php non può eseguire un multithreading efficiente e generalmente non è particolarmente adatto a questo).questa è un'opzione se hai bisogno di prestazioni elevate e probabilmente non è quello che stai cercando.

usa ajax e tira

in questo caso tutti i client interrogano costantemente (ad esempio ogni 2 secondi) se è successo qualcosa di nuovo.è strano perché ricevi risposte solo a quegli intervalli.inoltre, mette a dura prova il tuo server e la larghezza di banda.sai che un'applicazione utilizza questa tecnica perché il browser si aggiorna costantemente.questa è una soluzione non ottimale.

usa ajax e push

funziona con risposte in più parti e ha script (php-) di lunga durata nel backend.non è la soluzione migliore, ma la maggior parte delle volte è meglio che tirare e funziona e viene utilizzata in diverse app di chat ben note.questa tecnica viene talvolta chiamata COMETA.

il mio consiglio:se hai bisogno di un'app di chat per uso produttivo, installane una esistente.programmare applicazioni di chat non lo è Quello facile.

se vuoi solo impararlo, inizia con una semplice app ajax/pull, quindi prova a programmarne una usando ajax e push.

e sì, molto probabilmente avrai bisogno di un database, anche se ho implementato con successo una soluzione ajax/pull molto semplice che funziona con file di testo per divertimento (ma certamente non la userei in produzione!).

non è (per quanto ne so, ma ne sono abbastanza sicuro) non è possibile creare un'app di chat senza un backend lato server (con solo javascript frontend)!

AGGIORNAMENTO

se vuoi sapere come viene eseguito il data push, guarda la fonte qui: http://wehrlos.strain.at/httpreq/client.html.multipart asincrono è ciò che desideri :)

function asSendSyncMulti() {
    var httpReq = new XMLHttpRequest();

    showMessage( 'Sending Sync Multipart ' + (++this.reqCount)  );

    // Sync - wait until data arrives
    httpReq.multipart   = true;     
    httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
    httpReq.onload = showReq;
    httpReq.send( null );
}

function showReq( event ) {
    if ( event.target.readyState == 4 ) {
        showMessage( 'Data arrives: ' + event.target.responseText );
    }
    else {
        alert( 'an error occured: ' + event.target.readyState );
    }

}

viene chiamato showReq ogni volta i dati arrivano, non solo una volta come nelle normali richieste Ajax (non sto usando jquery o prototipo qui, quindi il codice è un po' obsoleto - è davvero vecchio :)).

ecco la parte lato server:

<?php

    $c = $_GET[ 'c' ];

    header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');

    sleep( 1 );

    print "--rn9012\n";
    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: First Part of Request " . $c . "\n";
    print "--rn9012\n";
    flush();

    sleep( 3 );

    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: Second Part of Request " . $c . "\n";
    print "--rn9012--\n";

?>

aggiornamento2

per quanto riguarda la banca dati:se hai un'architettura non condivisa come mod_php/cgi nel backend, tu sicuramente Bisogno Alcuni tipo di archiviazione esterna come database o file di testo.Ma:potresti fare affidamento sulla memoria scrivendo il tuo server http (possibile con php, ma non lo consiglierei per lavori seri).non è davvero complicato, ma probabilmente un po' fuori dallo scopo della tua domanda ^^

aggiornamento3

ho fatto un errore!ho confuso tutto, perché è da molto tempo che in realtà faccio qualcosa del genere.ecco le correzioni:

  1. le risposte in più parti funzionano solo con i browser Mozilla e quindi sono di uso limitato.COMET non significa risposta in più parti.

  2. COMETA significa:risposta tradizionale a parte singola, ma mantenuta (con un ciclo infinito e una sospensione) finché non sono disponibili dati.quindi il browser ha 1 richiesta/risposta per ogni azione (nel caso peggiore), non una richiesta ogni x secondi, anche se non accade nulla che meriti una risposta.

Altri suggerimenti

Lei parla di voler far funzionare tutto questo, senza un DB, e senza che il client (s) il polling del server per gli aggiornamenti.

In teoria si può fare questo memorizzando il "log" di chat in un file di testo sul server, e cambiare la vostra pagina in modo che l'utente fa una richiesta GET sulla pagina file chat.php, ma la pagina PHP in realtà mai finiture restituzione all'utente. (Ad esempio, la risposta non viene completata)

Si avrebbe bisogno di rispedire alcuni " non op " dei dati per mantenere la connessione in corso, quando non ci sono messaggi, ma in teoria questo dovrebbe funzionare.

Il problema è, per realizzare quanto sopra è ancora un sacco di lavoro. Si avrebbe bisogno di fare i messaggi AJAX al server di presentare nuovi commenti ... del browser degli utenti sarebbe stato girare le per tutto il tempo (a meno che il nido chat log in un iframe - ad esempio più lavoro) ... e questo tipo di messa a punto sarebbe solo essere molto difficile da gestire.

Io suggerirei di afferrare una chat script gratuito da altrove (ad esempio http://tinychat.com/ ) o se si desidera ripristinare la propria (per divertimento / esperienza) poi andare avanti, ma iniziare con un DB e costruire una pagina che spingere e tirare i messaggi dal server.

Infine, se siete preoccupati per "martellamento" il server con richieste AJAX ... non lo fanno. Basta costruire la chat, poi se non ci trovate sono problemi di prestazioni, tornare a StackOverflow con una domanda su come ottimizzare in modo che centinaia di richieste non stanno inondando la chat quando non c'è attività.

Mentre HTTP non è fatto per spingere facile, è possibile emulare una connessione spinta avendo lo script PHP non terminerà mai e il risultato JavaScript essere guardato con attenzione.

In sostanza si sta simulando un lettore di flusso.

Se volete i nuovi utenti di caricare una storia della chat che si è verificato prima di entrare nella stanza, un DB o altro supporto di memorizzazione è necessaria. A meno che non si sta cercando di creare una chat per l'apprendimento, ci sono troppi là fuori per usare gratuitamente per fastidio.

http://tinychat.com è un altro semplice sito di chat.

AJAX funziona bene. Ho creato una semplice pagina per uno dei miei siti. Ma trovo che la chat non venga utilizzato tutte le volte che si potrebbe pensare.

Condivisione di dati diventa un po 'più complicato e sarebbe stato più facile da realizzare ospitando un server IRC e consentendo agli utenti di utilizzare client IRC che hanno capacità di scambio di dati. Anche se nulla vi impedisce di avere caricare un utente al sito, poi gli altri scaricare. Persona a persona sarebbe difficile con l'utilizzo di un'interfaccia web, perché gli utenti non sono collegati in alcun modo con l'altro.

  

e visualizza istantaneamente sul browser di tutti

Con php / JS non è possibile spingere i dati dal server al client. Così i vostri clienti hanno bisogno di chiedere i dati dal server. Ed è quello che scunliffe ha descritto nel suo post.

È possibile farlo interamente con HTML e JavaScript utilizzando un servizio come PubNub . Non avrebbe bisogno di un database come si potrebbe usare qualcosa come il storia api per popolare i messaggi di chat ultimi x.

Ecco un breve tutorial sulla costruzione di una chat app con PubNub.

in tempo reale Applicazioni Chat in 10 righe di codice

entrare descrizione dell'immagine qui

Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>

Chat Output
<div id=box></div>

<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
    channel  : channel,
    callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
    (e.keyCode || e.charCode) === 13 && PUBNUB.publish({
        channel : channel, message : input.value, x : (input.value='')
    })
} )
})()</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top