2013-04-20 25 views
7

Sto cercando la 'way to go' (ovvero il modo più efficiente, più utilizzato, generalmente accettato) per il ricaricamento dei dati da un server Web a un front-end. Nell'applicazione fine, avrò diversi campi di output in cui i dati deve essere scritto, ad esempio come questo:Dati di ricaricamento efficienti/trasferimento dei dati dal server al client

enter image description here

I flussi di dati saranno diverso tra loro per l'applicazione finale. Le linee dovranno essere ricaricate con dati aggiornati e aggiornati dal server.

Ho pensato di utilizzare le richieste Ajax per aggiornare come ogni secondo, ma ci deve essere un altro modo per farlo. Le richieste Ajax causeranno molto traffico di dati. Inoltre, quando si utilizza la chat di Facebook, non è necessario attendere ogni secondo, le chat vengono ricevute quasi istantaneamente. Tuttavia, non vedo richieste di polling Ajax fatte quando utilizzo gli strumenti di sviluppo di Mozilla Firefox. Questo mi ha fatto pensare se ci sarebbe stato un modo diverso per farlo.

Ho esaminato Node.js, ma sembra che non sia possibile con il mio host.

Ho sentito persone parlare di Ajax Push, è questo che dovrei usare? Se sì, puoi darmi un esempio di utilizzo di base?

In caso contrario, quale sarebbe quindi essere la strada da percorrere quando si dispone di più flussi di dati che devono essere ricaricati entro un secondo?

I requisiti sono velocità e basso traffico dati. Pertanto, non sarebbe un'opzione per eseguire il polling continuo del server, penso, perché ciò creerebbe un sovraccarico enorme.

Non penso che sia di alcuna importanza, ma sto usando PHP5.3 nel back-end e JavaScript con jQuery 1.9.1 nel front-end.

risposta

8

Questa domanda è stato chiesto a un certo numero di volte, ma in un leggermente diversi modi. Qui ci sono alcuni riferimenti che meritano una lettura:

In sintesi: se siete alla ricerca di costruendo yo la nostra soluzione che utilizza PHP su Apache, tenendo in sospeso connessioni persistenti (HTTP long-polling o streaming), utilizzerà le risorse molto rapidamente (è altamente inefficiente). Quindi, sarebbe meglio usare uno hosted solution (* disclaimer - Io lavoro per una soluzione ospitata).

Il polling HTTP-Long e lo streaming HTTP sono soluzioni che sono state sostituite da Server-Sent Events e WebSockets. Quindi, laddove possibile (dove il client web fornisce supporto) dovresti usare una di queste soluzioni prima di ricorrere a una soluzione basata su HTTP. Una buona tecnologia web in tempo reale gestirà automaticamente questo per voi.

Poiché il diagramma mostra che si sottoscrive a più flussi di dati, si dovrebbe prendere in considerazione anche una soluzione Publish/Subscribe che si adatta naturalmente a questo. Ancora una volta, una buona soluzione web in tempo reale ti fornirà questo.

Vedere anche realtime web technology guide.

+1

+1 Il rintracciamento di queste informazioni mi ha richiesto un po 'di tempo per un progetto recentemente pubblicato. Avevo zero esperienze di sviluppo web e sono rimasto sorpreso di apprendere che spingere i dati dal web server al browser era così raro. –

2

Penso che quello che stai cercando è generalmente chiamato Comet. La tecnica utilizzata è spesso la seguente:

  • Il client (browser Web) invia una richiesta al server per i nuovi dati. Questo non sta ricaricando la pagina, ma piuttosto è fatto in JavaScript
  • Il server risponde alla richiesta quando ha alcuni dati per il client. Ancora una volta, questo non ha alcun impatto sull'interfaccia utente poiché non è la pagina stessa che viene ricaricata: il flusso di dati viene eseguito "in background" per così dire, nel codice JavaScript.
  • Sul lato servizio, la richiesta attende nuovi dati e restituisce i nuovi dati quando disponibili oppure non restituisce nulla se viene raggiunto un intervallo di timeout (definito sul server). Di solito questo timeout è impostato su un valore inferiore al timeout HTTP del browser. La ragione di ciò è che il server può sapere se un particolare client ha ricevuto un particolare dato. Se la richiesta è consentita per il timeout sul lato client, la richiesta originale potrebbe essere risolta dal server dopo che il client è scaduto e il client non otterrà i dati, anche se il server pensa di averlo fatto.

I dati vengono in genere trasferiti come JSON, ma è possibile scegliere qualsiasi codifica che si desidera. Vedi here per un esempio su come farlo. Goosh è un altro esempio di questa tecnica e lo è anche Interactive Python Shell. Il codice per tutti è disponibile.


Sul lato PHP, si desidera creare una pagina che risponderà a queste richieste di cometa JavaScript "di sfondo". Potrebbe essere la stessa pagina di quella caricata dall'utente, ma diciamo che è diversa, per facilità di spiegazione. Quindi l'utente carica index.php e il codice JavaScript Comet chiama getNewData.php per recuperare nuovi dati.

Nel tuo getNewData.php dovrai aspettare il tuo evento e restituire i dati. Non si desidera utilizzare il polling per questo, ma ci sono librerie PHP che consentono di utilizzare varie strategie di comunicazione tra processi per attendere sugli eventi, vedere this question for instance. Lo pseudo-alto livello per il vostro getNewData.php apparirebbe come segue:

  1. parse richiesta JSON
  2. Inserisci un efficiente stato di attesa (con timeout), attesa per il vostro "sono disponibili nuovi dati" evento
  3. Did precedente scappare?
    Sì: invia una risposta che indica nessun dato
    No: inviare la risposta con i nuovi dati
+0

Sebbene questa risposta sia tecnicamente corretta, consiglia una soluzione obsoleta e inefficiente, risolta meglio con le tecnologie più recenti. Comet è un termine generico per gli hacker HTTP per ottenere il tipo di funzionalità richiesto. HTML5 ha introdotto [Eventi inviati dal server] (http://en.wikipedia.org/wiki/Server-sent_events) e [WebSockets] (http://en.wikipedia.org/wiki/WebSocket) in modo tale che questi hack non erano più lungo il primo punto di chiamata per risolvere questi tipi di problemi. Inoltre, un approccio a lungo termine (come delineato in questa risposta), su un server PHP, sarà altamente inefficiente. – leggetter