Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [pillola] PHP e AJAX => l' Http Streaming...

    Fare Http Streaming consiste nel cambiare l'approccio di comunicazione con il server, si passa dal Polling al Pushing, in modo da rimanere sempre in ascolto e lasciare che sia il server ad inviarci un flusso continuo di dati.
    In una comunicazione di tipo polling, che è quella alla base della comunicazione Client-Server, in linea generale:
    1. Scriviamo l'url della risorsa che desideriamo ricevere
    2. Arriva la richiesta al server che la elabora e ci risponde
    3. il browser legge e interpreta la risposta del server e ci fa vedere il risultato.
    Già al termine del 2° punto la comunicazione con il server è chiusa e bisogna ripetere la procedura per avere accesso di nuovo alla risorsa.
    Con AJAX non facciamo altro che ripetere questi 3 punti, ma in maniera asincrona, effettuano la richiesta con l'oggetto XMLHttpRequest e poi elaborando come meglio crediamo i risultati (che possiamo ricevere da 2 metodi: responseXML e responseText)
    Se volessimo implementare una chat in PHP e AJAX dovremmo fare delle continue richieste al server per sapere se ci sono o meno nuovi messaggi e visualizzarli,stesso discorso per un sistema di monitoraggio ecc.ecc.
    Con un Server Push (o pushing) evitiamo queste continue richieste mantenendo aperto un canale di comunicazione con il server, che ci invierà un flusso continuo di dati...
    Vediamo come:
    L'esempio è molto banale...e il codice non ottimizzato, ha solo uno scopo dimostrativo.

    Ecco il contenuto del Javascript che richiama la risorsa sul server e ne legge il flusso di ritorno
    codice:
    <script language="javascript" type="text/javascript">
    
    var url = 't.php';
    
    if(window.XMLHttpRequest) 
    {	XmlHttp = new XMLHttpRequest(); 
    	XHRprovider = 'FF';
    }
    else 
    if(window.ActiveXObject)
    { try {	XmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
    	XHRprovider = 'IE';
    	}
      catch(e)
    	{ XmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    	  XHRprovider = 'IE';
    	}
    }
    else { alert("NO XMLHttpRequest Object");}
    
    function OpenSend (url)
    { XmlHttp.open('GET', url, true);
      XmlHttp.setRequestHeader('x-arrt-xhrprovider',  XHRprovider);
      XmlHttp.send(null);
    }
    
    OpenSend (url);
    
    KeepsReading = window.setInterval(	function()
     { switch (XmlHttp.readyState)
       {    case 3: if (XHRprovider=='FF') ShowStreaming (XmlHttp.responseText);
    		break;
    	case 4: // Solo IE
    		ShowStreaming (XmlHttp.responseText);
    		XmlHttp.Abort();
    		OpenSend(url);
    		break;
       }
     },500);
    
    function ShowStreaming (dati)
    { document.getElementById('streaming').innerHTML=dati;
    }
    </script>
    lo script PHP che manda il flusso è ovviamente un loop
    Codice PHP:
    header ("Expires: Tue, 01 Jan 1980 00:00:00 GMT");
    header ("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
    header ("Cache-Control: no-store, no-cache, must-revalidate");  
    header ("Cache-Control: post-check=0, pre-check=0"false);
    header ("Pragma: no-cache");
    header ("Content-type: text/html; charset=iso-8859-1");
    $headers apache_request_headers();
    $_XHRprovider =(array_key_exists("x-arrt-xhrprovider",$headers))?$headers['x-arrt-xhrprovider']:"FF";
    $exit=false;
    while ( (
    true)&&(!$exit) )
    {    echo 
    gmdate("D, d M Y H:i:s")."
    "
    ;
        if (
    $_XHRprovider=="IE")
        {    
    $exit=true;    }
        else
        {    
    ob_flush();
            
    flush();
            
    sleep(1);
        }

    commentiamo...
    nel codice JS come avrete notato non viene più richiamato il metodo onreadystatechange perchè in effeti non ci serve più... abbiamo fatto noi una funzione che periodicamente legge l'output...

    nello script PHP si ha un loop... all'interno ovviamente ci faccimo quello che vogliamo potremmo ad esempio estrapolare dal DB il numero di messaggi spediti nella chat, le quotazioni in borsa ecc ecc...

    ma veniamo alle note dolenti....

    in FireFox (ma dovrebbe andare per tutti i browser che supportano nativamente l'oggetto XMLHttpRequest) si verifica un vero e proprio streaming....
    il metodo readyState dell'oggetto XMLHttpRequest resta fermo allo stato 3 (comunicazione in corso) e noi riceviamo continuamente i dati con un flusso continuo...
    inInternet Explorer (ovviamente) questo non avviene....
    ciò perchè IE non restituisce nulla, sopprime il metodo responseText,finche la comunicazione non termina e cioè finchè non si arriva allo stato 4

    che dire....
    Io mi sono incazzato perchè questa tecnica di streaming mi sarebbe ritornata mooooolto comoda in un lavoro che dovrò consegnare tra non molto....e quindi ho tirato giù dal calendario un paio di Santi
    su Ajax Pattern, da cui prende spunto la pillola, sono un tantino più diplomatici e dicono:
    "You could claim that's either a bug or a feature; but either way, it works against HTTP Streaming."

    Nel codice come avrete notato c'è un piccolo hack per IE:
    ovvero mando al server anche un header ad hoc che lo informa che sta avendo a che fare con un caca browser e che quindi dopo i primi dati e inutile che lavora ed è meglio che esce...
    restituendo così i dati e chiudendo la comunicazione

    in JS il metodo readyState passa llo stato 4
    prendo i dati li visualizzo e faccio ripartire subito un'altra chiamata al server...
    ovviamente non è più streaming questo!

    a voi la decisione se usare questa tecnica o meno...

    giusto per completezza di informazione,
    ci sono delle applicazioni (alcune free in JAVA) che raggirano il problema .... ma sono un'altra cosa...sono delle applicazioni StandAlone sul server, in ascolto su una porta, che gestiscono internamente il flusso di dati in uscita e le varie connessioni aperte...insomma un vero e prorio server push.
    quello che ho proposto è una simulazione di un server push... e che se IE si comportasse bene....sarebbe una grande cosa: netta diminuzione delle chiamate al server con conseguente minor carico di Apache e la possibilità di ricevere in (quasi) real-time un flusso di informazioni.

    non ho testato non IE 7, se qualcuno prova mi fa sapere

    se avete idee in merito su come poter risolvere con IE.....parliamoneeee...

    There are 10 types of people in the world: Those who understand binary, and those who don't.

  2. #2
    ci sono altre soluzioni allo streaming di questo tipo

    penso che a te ti serva per aggiornare in tempo reale su delle operazioni che stai svolgendo, tipo una bella progress bar con una lista di operazioni da svolgere o cose simili

    beh ... lo si può fare facilmente anche senza streaming e senza ajax

    il browser richiama la pagina php ... e il php invia TUTTO l'html senza però chiudere il body e dopo di che inizia a inviare dei tag script che contengono javascript che aggiorna la progress bar, le liste, e tutto quello che vuoi ...

    echo "<script>..........</script>"; flush();

    in questo modo puoi aggiornare tutto quello che vuoi in tempo reale

  3. #3
    Originariamente inviato da daniele_dll
    ci sono altre soluzioni allo streaming di questo tipo

    penso che a te ti serva per aggiornare in tempo reale su delle operazioni che stai svolgendo, tipo una bella progress bar con una lista di operazioni da svolgere o cose simili
    bhè non è la progress bar il mio problema....non vale mica un bel po di Santi una progressbar

    devo implmentare (tra le altre cose) una messaggeria istantanea come il Messenger...quindi non una chat con una stanza unica ma tutti pvt (diciamo così)
    e una soluzione streaming con AJAX mi sarebbe stata molto comoda perchè evito una richiesta al server ogni 2-3 secondi!
    Il server, nel mio caso restituisce un XML con la situazione aggiornata delle varie sessioni di chat aperte, e se ce ne sono di nuove, oltre alla lista di quelli al momento sono on line. L'invio del messaggio è una chiamata a parte.
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  4. #4
    beh ... lo streaming non ti sarebbe servito a nulla

    avresti dovuto lasciare la connessione sempre aperta e quindi lo script sempre avviato che controllava collassando tutto

  5. #5
    non capisco perchè dovrebbe collassare tutto
    appena farò qualche prova....vedremo

    in effetti basterebbe che lo script girasse per 5-6 minuti...poi una chiamata al server ogni 5 minuti si può fare

    il problema è che devo gestire dalle 300 alle 500 persone on line ed effettuare così tante richieste nel giro di 2-3 secondi al server non mi sembra opportuno...visto che deve girare pure il sito

    scusa tu come avresti risolto? non con uno Streaming ??
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  6. #6
    ragazzi come si può fare integrare ciò con php per effettuare una chat?
    Io con il php l'ho fatta, però ogni volta bisogna premere refresh, posso chiedere a voi mostrandovi lo script?
    Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it

  7. #7
    avrei risolto con un software non web ^^

    tieni conto che se sono questi i numeri è un totale ed assoluto suicidio con o senza streaming

    con uno streaming dovresti connetterti allo script e lasciare questo in esecuzione a tempo praticamente indeterminato (impostando il set_time_limit a zero) e in aggiunta ogni mezzo secondo o quello che vuoi dovresti controllare il database per verificare se c'è roba da visualizzare

    moltiplicalo per 300 e ti ritrovi 300 processi sempre avviati con una connessione fissa a mysql che lo fracchiano a rotazione

    con le richieste, anche se continue, e anche se generi poco più traffico ... hai un carico infinitamente più ridotto ... e penso che se invece di far arrivare la risposta dopo che si batte invio la si fa arrivare 1/2 secondi dopo ... non succede nulla

  8. #8
    eheh ho capito ma sto messenger lo voglio no integrato nel sito con il loro layout...sennò gli buttavo un server irc e buonanotte
    io sti conti li avevo fatti e come...
    in effetti avevo pensato di montare un PAMPA o qualcosa di simile, quindi un0altro apache, in ascolto x esempio sulla 81, e un altro mysql...
    solo per il messengering

    il set_time_limit a zero non va con la modalità sicura...e cmq un flusso streaming di 5-6 minuti è già molto....

    per le chiamate al DB....1 al secondo....idem i controlli lato client

    mha, io non ho ancora fatto prove, però in teoria pensavo che 1 chiamata al server moltiplicata per 400 (media utenti on line) sono 400 richieste al secondo.... perciò mi ero messo sullo streaming....uno sleep(1) dovrebbe bastare no?
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  9. #9
    Originariamente inviato da Albertorrr
    ragazzi come si può fare integrare ciò con php per effettuare una chat?
    Io con il php l'ho fatta, però ogni volta bisogna premere refresh, posso chiedere a voi mostrandovi lo script?
    potresti usare AJAX con un setInterval per aggiornare....
    o usare lo streaming di cui ho parlato sopra....
    in effetti sono la stessa cosa queste due soluzioni... solo che con lo streaming (che non funge su IE) lasci un canale aperto e continui a prendere dati senza rilanciare ogni volta una connessione conil server.

    se non sai dove mettere le mani in Javascript per AJAX
    comincia a dare uno sguardo qui
    http://forum.html.it/forum/showthrea...ight=chat+ajax

    qui ci sono degli esempi semplici che ti possono far capire come funziona AJAX
    http://bazzinet.info/JS-Request
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  10. #10
    non mi servono tantissime cose
    l'importante, diciamo , che la pagina si aggiorni in automatico come tutte le chat, non lo conosco ajax, esiste comando veloce?

    Grazie ciao
    Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it

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 © 2025 vBulletin Solutions, Inc. All rights reserved.