Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21

Discussione: garbage collection

  1. #11
    Ho riletto tutto. Come suggerisce Fabio, se inserisci l'id di sessione nel db allora confronta quell'id e non quello passato da $_SESSION. Altrimenti sarebbe inutile mettercelo.

    Quando estrai l'id di sessione da db, metti nelle condizioni where la scadenza, in modo che se non estrai dati (result record = 0) sai che o si tratta o di id di sessione inesistente, oppure di tempo scaduto e allora distruggi la sessione.

    $_SESSION = array();
    session_destroy();

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  2. #12
    Se ho capito bene cosa vuoi ottenere io userei una tabella di questo tipo

    utenti_online
    -------------
    id_sessione (chiave primaria)
    ultimo_accesso

    In php fissi una scadenza in secondi

    session_start() ;
    $scadenza = 120 ;
    $id_sess= session_id() ;

    Poi ad ogni accesso dell'utente fai

    SELECT UNIX_TIMESTAMP(ultimo_accesso)) AS lastIn FROM ciccio WHERE id_sessione = $id_sess

    così verifichi l'ultimo accesso, prelevi il risultato dal db e poi

    if( (time() - $risultatoQuery) > $scadenza )
    {

    session_destroy() ;
    //DELETE FROM ciccio WHERE session_id=$id_sess

    }
    else
    {

    //aggiorno l'ultimo accesso e mantengo l'utente valido
    //UPDATE ciccio SET ultimo_accesso= NOW() WHERE session_id=$id_sess

    }

    Per sapere il numero di utenti online fai un count(*)

    Ovviamente se usi direttamente le sessioni su db fai prima.

    In ogni caso non si può capire con precisione esatta quando l'utente chiude il browser perchè essendo la chiusura del browser un evento client non lo si può rilevare lato-server
    per favore NIENTE PVT TECNICI da sconosciuti

  3. #13
    Utente di HTML.it
    Registrato dal
    Oct 2001
    Messaggi
    275
    ok, grazie per i suggerimenti!
    faccio le prove e poi vi dico

  4. #14
    Utente di HTML.it
    Registrato dal
    Oct 2001
    Messaggi
    275
    grazie a tutti! funziona benissimo!
    il codice è:

    $query = "SELECT UNIX_TIMESTAMP(data_last_update) AS lastIn FROM products WHERE session_id = '$_SESSION[session_id]'";
    $id_risult = mysql_query($query, $id_conness);

    if(!$id_risult) {echo "Lettura impossibile,
    errore N° ",mysql_errno()," ",mysql_error(),".";}

    while ($row = mysql_fetch_array($id_risult,MYSQL_ASSOC))

    echo "Last Update: $row[lastIn]</br></br>";
    echo time();
    if ((time()-$row['lastIn'])<$scadenza)
    {
    $query="DELETE FROM products WHERE session_id = '$_SESSION[session_id]'";
    $id_risult = mysql_query($query, $id_conness);

    if(!$id_risult) {echo "Lettura impossibile,
    errore N° ",mysql_errno()," ",mysql_error(),".";}

    echo "Sessione eliminata
    ";
    echo "destroy";
    session_destroy();
    } else {
    echo "non distruggere";
    }


    ma volendo posso mettere tutto nel config.inc.php?

  5. #15
    scusate ma non vorrei aver capito male visto che ultimamente sbando parecchio...

    cioé così dal db non verranno eliminati tutti i dati di chi si connette una sola volta no?

    non sarebbe più semplice dare l'istruzione
    codice:
    session_start();
    $session = session_id();
    $timeout = 10; // in minuti
    $set_timeout = 60*$timeout;
    mysql_query("DELETE FROM tabella WHERE (ultimo_accesso+$set_timeout) > NOW()");
    $result = mysql_query("SELECT 1 FROM tabella WHERE session='$session'");
    if(mysql_num_rows($result) > 0) {
         mysql_query("UPDATE tabella SET ultimo_accesso=NOW() WHERE session_='$session'");
    } else {
         mysql_query("INSERT INTO tabella (session, ultimo_accesso) VALUES('$session', NOW())");
    }
    in modo da avere soli i dati di chi non è in timeout
    E' la mia opinione ed io la condivido
    Non condivido la tua idea ma darei la vita perché tu la possa esprimere (Voltaire)
    Scrivi sul muro

  6. #16
    Ciao Boomboom,
    sì è più semplice dal punto di vista del codice ma volevo evitare che ad ogni accesso si effettuasse un controllo su *tutti* i record scaduti, nell'ipotesi non confermata che il database lavori di meno.

    Questo invece secondo me va convertito con UNIX_TIMESTAMP

    WHERE (ultimo_accesso+$set_timeout) > NOW()");

    perchè NOW() non restituisce un timestamp ma una stringa
    per favore NIENTE PVT TECNICI da sconosciuti

  7. #17
    Oppure se ultimo_accesso e' un campo datetime:

    WHERE (ultimo_accesso + interval $set_timeout minute) < NOW()");

    ovviamente set_timeout in minuti.

    Questo modo scorre tutta la tabella, si potrebbe aggiungere in AND id = $id, per limitare la scansione, ma offre il vantaggio di ripulire tutti i record scaduti.

    Mentre lo script proposto da mystica ha alcune imprecisioni e sopratutto non considera la possibilita' che l'id non sia presente e i record estratti = zero.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #18
    Utente di HTML.it
    Registrato dal
    Oct 2001
    Messaggi
    275
    ciao piero.mac,
    che imprecisioni?
    all'inizio dovrei mettere
    if(isset($_SESSION["session_id"])) ?
    e per record estratti uguali a zero cosa si intende?
    grazie!

  9. #19
    Originariamente inviato da mystica
    ciao piero.mac,
    che imprecisioni?
    all'inizio dovrei mettere
    if(isset($_SESSION["session_id"])) ?
    e per record estratti uguali a zero cosa si intende?
    grazie!
    Pricipalmente non consideri che l'id possa non esserci nel db.

    No prenderlo come una critica..... solo una lettura dello script visto con una logica diversa. Basiamoci sul tuo e non su quello di boomboom69 che e' strutturato diversamente.

    Selezioni un timestamp dal db associato ad un session_id:

    $query = "SELECT UNIX_TIMESTAMP(data_last_update) AS lastIn FROM products WHERE session_id = '$_SESSION[session_id]'";

    $id_risult = mysql_query($query, $id_conness);

    if(!$id_risult) {echo "Lettura impossibile,
    errore N° ",mysql_errno()," ",mysql_error(),".";}


    Prima considerazione. Perche' while se il risultato atteso e' uno solo?
    Seconda. Che succede se l'id non esiste e ti ritorna nessun record?

    while ($row = mysql_fetch_array($id_risult, MYSQL_ASSOC))


    facciamo finta che non c'e' il record.

    echo "Last Update: $row[lastIn]</br></br>";
    echo time();


    un notice per $row[lastIn] inesistente. Entriamo nella if che risultera' falsa perche' sicuramente time() - 0 superiore a $scadenza (intanto altro notice):

    if ((time()-$row['lastIn'])<$scadenza)
    {
    $query="DELETE FROM products WHERE session_id = '$_SESSION[session_id]'";
    $id_risult = mysql_query($query, $id_conness);

    if(!$id_risult) {
    echo "Lettura impossibile, errore N° ",mysql_errno()," ",mysql_error(),".";
    }
    echo "Sessione eliminata
    ";
    echo "destroy";
    session_destroy();


    Saltando d'amble' tutto l'if perche' FALSE, cadiamo nell'else..... che fa l'else?

    } else {
    echo "non distruggere";
    }


    Cioe' considera valida una sessione inesistente.

    Lo script di boomboom sembra piu' conveniente... l'unico problema e' nella riga indicata da Fabio e sottolineata da me successivamente, dove, oltre all'appunto di Fabio, bisogna mettere "< minore", e non "> maggiore" di NOW().

    Non considero quello che e' omesso perche' potrebbe o non potrebbe esistere... certamente dopo il session_start() verificare se $_SESSION sia valorizzato e' il meno che si possa fare. Che sia lo stesso session_id lo darei per scontato. Cioe' se SESSION e settato significa che session_start lo ha recuperato.

    Se riesci ad utilizzare lo script di boomboom69 con le modifiche suggerite credo che il suo script sia meglio ottimizzato del tuo.



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #20
    Utente di HTML.it
    Registrato dal
    Oct 2001
    Messaggi
    275
    Grazie ancora
    nel frattempo però mi è venuto un dubbio:
    il codice è:

    if ((time()-$row['lastIn'])<$scadenza)

    ma non si tratta di unità di misura diverse?

    time() mi stampa una cosa tipo 1093679278 (ora attuale in secondi giusto?);

    $row['lastIn'] mi dà 20040828094729 (secondi + data al contrario);

    $scadenza 1200 (lo imposto io, sono secondi vero?)

    quindi se faccio la sottrazione, il risultato ha senso?
    O forse dovrei trasformare qualche dato?
    Grazie!

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.