• User Newbie

    Blocchiamo php

    Un saluto a tutti,
    ho fatto qualche ricerca prima di decidere a postare, ma non ho trovato niente; se l'argomento è già stato trattato mi scuso in anticipo.
    Premesso che con php sono al primo vagito, c'è un modo per bloccare una funzione?
    Mi spiego: vorrei realizzare un applicazione che rinfreschi una lista solo quando ci sono nuove informazioni disponibili.
    Lo script di presentazione già l'ho fatto e funziona, pesca i dati dal server mysql e li mette in bella mostra. Usa ajax per non rinfrescare tutta la pagina e non è venuta malaccio. Il mio problema è questo: mi scoccia avere il pulsante 'aggiorna'. Mi scoccia ancora di più, pollare ad un tempo più o meno stretto per vedere se ci sono nuovi dati. C'è un modo tramite il quale invocare uno script php (che poi richiamerei tramite ajax senza patimenti da parte dell'utente) che possa in qualche modo "bloccare" per tornare solo ad una certa condizione (nella fattispecie, quando ci sono nuovi dati, ma il concetto si può anche astrarre).
    Se ho chiesto una scemenza vi autorizzo sin da ora a prendermi per i fondelli ad oltranza.
    Saluti.


  • User Newbie

    Uhm, che ne pensate di quest'approccio?
    L'utente richiama la pagina una prima volta; lo script la popola coi record restituiti dal db dopodichè fa partire una richiesta ajax asincrona restituendo il controllo all'utente immediatamente. Lo script target della richiesta ajax non la completa bensì verifica la disponibilità di nuovi dati a polling utilizzando la funzione sleep() qualora non ce ne siano di disponibili. Qualora ce ne siano, completa la richiesta invocando la callback lato client che aggiunge il nuovo record. La stessa callback, aggiunto il nuovo elemento, richiama nuovamente la richiesta asincrona ricorsivamente. Così via finchè non si abbandona la pagina.
    Caspita, odio pollare. Qualche altra idea? Sostanzialmente, avrei bisogno di una mysql_query che non esca qualora non ci sia un recordset da restituire... :arrabbiato:


  • User Attivo

    "Timeout" ti dice nulla?... non puoi bloccare uno script, ti andrebbe in timeout o altri errori simili. Oltretutto, se blocchi uno script e' come se ti bruciassi una connesione, quindi un utente in meno che si puo' collegare...
    Poi vedi tu che fare...


  • User Newbie

    Uhm...
    interessante. Il timeout non è un problema fintanto che, a parità di condizioni, lo script php restituisca sempre lo stesso errore; la callback ajax lato client può semplicemente interpretare questo errore dato come la mencanza di dati e reiterare ancora.
    Per quanto concerne le connessioni, ma l'http non è connectionless? Se sotto c'è un socket scollegato, non ci si brucia alcuna connessione in realtà.
    L'unico inconveniente che riesco a vedere è un overhead della cpu del server; ma lo sleep php dovrebbe essere molto efficente (almeno lo è quello di tutti gli altri linguaggi).


  • User Attivo

    scusami, ma fintanto che il browser fa una richiesta al server e il server la elabora e ritorna i dati la connessione e' attiva... quindi occupata... se il server si becca uno sleep sta li e attende...
    I DB hanno timeout, quindi se hai aperto una connessione al DB prima dello sleep dopo potresti trovartela chiusa... ma se e' ancora aperta, hai tenuto occupata una connessione inutilmente per X secondi...
    e anche una connessione http al server...

    Ora, se vuoi fare sleep e cose varie e le fai lato client, puoi fare tutto cio' che vuoi senza troppi problemi, ma in PHP no... domanda del browser->elaborazione-del-server->risposta...


  • User Newbie

    Allora, ho sniffato un pò e...
    ho verificato (non lo sapevo :???:) che i socket sottostanti sono TCP e non UDP. Quindi è connectionless un paio di ciufoli.
    In quest'ottica hai perfettamente ragione tu: mi brucio un connessione. Quindi niente da fare :rollo:


  • User Attivo

    lo so che ho ragione 😛 mi ci sono schiantato per bene sui timeout.... :S
    Prova a fare della ricorsione in php e scoprirai un mondo fantastico!!! __


  • User Newbie

    hihihihi ho fatto in questo modo:

    • uno script php realizza la pagina la prima volta mettendo a video i record. Sull' onLoad del body uno script lato client, usando la setInterval, invoca un secondo script client.
    • questo secondo script effettua una richiesta asincrona (ajax) verso uno script php lato server che ritorna le nuove righe se disponibili, altrimeni nisba
    • quando lo script delle nuove righe completa, viene invocata una callback lato client. Questa se ci sono le righe nuove le mette a video, in ogni caso invoca prima d'uscire lo script lato client che fa la richiesta ajax.
      E tutto si ripete liscio come l'olio. Di fatto è un ciclo stretto, ma non noto overhead. Non ci sono sleep e non c'è ricorsione poichè la callback di completamento non chiama se stessa bensì un altro script.
      La struttura è
      richiesta client -> risposta server -> callback client -> richiesta client
      Non posso farla circolare ma ci siamo capiti.
      Funziona (mi pare) abbastanza bene :1145359704-55: