Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44

    problema loop (long-polling)

    Sto cercando di implementare un servizio real time che stia in ascolto su eventuali cambiamenti che avvengono nel db.

    lato client:
    --------------------------------
    chiamata ajax asincrona con timeout prefissato e, una volta scaduto, esecuzione di nuovo della stessa funzione
    --------------------------------

    lato server:
    --------------------------------
    while(!condizione_verificata){
    sleep(1);
    }
    die(json_encode("risultato"))
    --------------------------------

    Ora supponiamo di avere un timeout lato client di 30 secondi; se in quei 30 secondi volessi: refreshare la pagina cambiare pagina o fare qualsiasi altra cosa devo aspettare che il loop lato server sia terminato il che rende inutilizzabile il servizio. Non volendo abbassare il timeout come faccio a forzare l'uscita dal loop?
    Cercando qua e là ho letto che facebook google e altri usano uno schema di base che si chiama comet, che deve essere simile a questo (come logica di base eh !)..
    ringrazio chiunque provi a risolvere il problema anticipatamente

  2. #2
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Cercando qua e là ho letto che facebook google e altri usano uno schema di base che si chiama comet
    Avrai letto un post molto vecchio. Quasi più nessuno usa ajax per ottenere un servizio in real time. Comet/long-polling, è una tecnica che ha più di un lustro e non è più attuale. Oggi si usano i web socket.

    Cerca "Server-send Event" su google, probabilmente è quello che cerchi, ed è molto semplice da implementare. Lato server avrai qualcosa come

    codice:
    <?php
    
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    
    
    $startedAt = time();
    do {
      if ((time() - $startedAt) > 30) {
        die;
      }
    
      if (condizione_verificata) {
           echo 'id: ' , time(), "\n";
           echo 'data: ' , json_encode("risultato");
           echo "\n";
           ob_flush(); flush();
       }
    
    
      sleep(1);
    
    
    } while(true);
    Ultima modifica di .Kurt; 07-10-2015 a 16:46

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44
    BRAVO!
    con questo ho quasi risolto,
    con IE vado di long polling?

  4. #4
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    con IE vado di long polling?
    Che intendi? IE è un browser

  5. #5
    Se non sbaglio IE supporta webseockets solo dalla versione 10

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44
    Scusa mi sono spiegato male,
    La chiamata javascript dal client per accedere a quel php sfrutta la funzione HTML5 "Server-Sent Events" giusto?
    IE non la supporta pero' e un po' tutti i browser datati non la supportano no? quindi faccio long polling con ajax? grazie sei molto gentile

  7. #7
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Hai ragione, IE non li supporta. Puoi emularli con https://github.com/remy/polyfills o passare direttamente a usare i websocket (supporto da IE 10 in poi)

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44
    Avevo paura di questa risposta
    Con i websocket cambia sostanzialmente l'approccio? ho provato a documentarmi ma faccio proprio fatica a capire come funzionano. riusciresti ad indicarmi uno schema logico? grazie davvero

  9. #9

  10. #10
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    SSE usa il solito (e noioso) protocollo http, che usi tutti i giorni. Sicuramente è più facile da usare, contrariamente a WS che usa un suo protocollo e richiede un pochino di lavoro in più da fare. Ma non è nulla di eccessivamente complesso, e le documentazioni/tutorial/librerie abbondano.

    Non ho ben capito con precisione qual'è la funzionalità che stai cercando di implementare, quindi non me la sento di consigliarti di usare SSE al posto di WS, e viceversa.
    In ogni caso non dovresti scoraggiarti dall'usare SSE in base all'attuale supporto del browser in commercio. Puoi estendere il supporto molto le facilmente anche su browser molto datati:
    https://github.com/remy/polyfills/bl...EventSource.js
    https://github.com/Yaffle/EventSourc...eventsource.js
    https://github.com/rwaldron/jquery.eventsource
    Ultima modifica di .Kurt; 07-10-2015 a 18:25

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.