Esiste un'alternativa a Ajax che non richiede il polling senza modifiche sul lato server?

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

Domanda

Sto cercando di creare un piccolo " ajax " gioco multiplayer basato. Le coordinate degli oggetti vengono fornite da un PHP & Quot; gestore & Quot ;. Questo file handler.php viene sottoposto a polling ogni 200 MS, usando ajax.

Dal momento che non è necessario effettuare il polling quando non accade nulla, mi chiedo, c'è qualcosa che potrebbe fare la stessa cosa senza frequenti polling? Per esempio. Comet, anche se ho sentito che è necessario configurare le applicazioni lato server per Comet. È un server web condiviso, quindi non posso farlo.

Forse impedire al file handler.php di restituire anche una risposta se non si deve cambiare nulla sul client, è possibile? Poi di nuovo avresti ancora il client inutilmente chiedere una risposta anche se qualcosa non è ancora cambiato. Fondamentalmente, dovrebbe usare la larghezza di banda e tagliare le risorse solo se qualcosa deve essere detto al client, ad es. il cambiamento delle coordinate di un oggetto.

È stato utile?

Soluzione

Ecco una soluzione: usa un provider di comete SaaS, come WebSync On-Demand . Nessuna risorsa server di cui preoccuparsi, hosting condiviso o no, poiché è tutto scaricato e puoi inviare le informazioni secondo necessità.

Dato che è SaaS, funzionerà con qualsiasi lingua del server. Per PHP, c'è già un editore scritto e pronto per l'uso.

Altri suggerimenti

La cometa è generalmente usata per questo tipo di cose, e può essere una configurazione fragile in quanto non è una tecnologia particolarmente comune, quindi può essere facile non " farlo bene. " Detto questo, ci sono più risorse disponibili ora rispetto a quando l'ho provato l'ultima volta ~ 2 anni fa.

Non credo che tu possa fare quello che stai pensando e avere handler.php semplicemente non restituire nulla e interrompere l'esecuzione: il web server manterrà la connessione aperta e impedirà ulteriori polling fino a quando handler.php non fa qualcosa (termina o fornisce output). Quando lo fa, stai ancora gestendo una risposta.

Puoi provare una lunga tecnica di polling, in cui AJAX consente un timeout molto grande (ad es. 30 secondi) e handler.php gira senza rispondere fino a quando non ha qualcosa da segnalare, quindi ritorna. (Ti consigliamo di assicurarti che la rotazione non richieda molte risorse). Se handler.php & Quot; scade & Quot; e non succede nulla, fallo uscire e lascia che AJAX esegua nuovamente il polling. Dal momento che succede solo ogni 30 secondi, sarà un enorme miglioramento di circa 5 volte al secondo. Ciò ridurrebbe al minimo il polling.

Ma questo è il tipo di cosa per cui Comet è progettata.

Dato che Ajax offre solo un modello di richiesta del server client (normalmente chiamato pull, anziché push), l'unico modo per ottenere dati dal server è tramite le richieste. Tuttavia, una tecnica comune per aggirare il problema è che il server risponda solo quando ha nuovi dati. Quindi il client effettua una richiesta, il server si aggancia a quella richiesta fino a quando non accade qualcosa e quindi risponde. Ciò elude la necessità di frequenti polling anche quando i dati non sono cambiati in quanto è sufficiente che il client invii una nuova richiesta dopo aver ricevuto una risposta.

Dato che stai usando PHP, un metodo semplice potrebbe essere quello di fare in modo che il codice PHP chiami il comando sleep per 200 ms alla volta tra i controlli per le modifiche dei dati e quindi restituisca i dati al client quando cambia.

MODIFICA: consiglierei anche di avere un timeout sulla richiesta. Quindi se non accade nulla per dire 2 secondi, un & Quot; nessuna modifica & Quot; il messaggio viene rispedito. In questo modo il client sa che il server è ancora attivo e sta elaborando la sua richiesta.

Poiché questo è taggato & # 8220; html5 & # 8221 ;: HTML5 ha <eventsource> e WebSocket , ma in pratica il lato dell'implementazione è ancora in futuro.

Opera ha implementato una vecchia versione di <event-source> chiamata <=>.

Il server deve prendere parte a questo. Verificare con il provider di hosting quali moduli sono disponibili. Oppure prova a convincerli a sostenere la cometa.

Forse dovresti prendere in considerazione un piccolo Virtual Private Server (VPS) per questo.

Una cosa da aggiungere ai suggerimenti di polling lunghi: se ci si trova su un server condiviso, questa soluzione avrà una scalabilità limitata, poiché ogni lungo sondaggio attivo manterrà una connessione (e un processo lato server per servire quella connessione) attivo. Molto probabilmente il tuo provider ha dei limiti (definiti dalla politica o di fatto) sul numero di connessioni che puoi aprire contemporaneamente, quindi colpirai un muro se hai più sessioni / finestre di quelle che giocano contemporaneamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top