Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 16 a 21 su 21

Discussione: garbage collection

  1. #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

  2. #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.

  3. #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!

  4. #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.

  5. #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!

  6. #21
    Originariamente inviato da mystica
    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!
    Guarda che in modo chiaro ti e' stato detto da Fabio e poi da me. Anche se il riferimento era allo script di boomboom.

    Fabio suggeriva a boomboom (indirettamente a te) un timestamp unix invece di NOW(), invece io ho aggiunto la possibilita' di fare tutto nella query utilizzando solo le funzioni mysql.

    Erano i racconti della serie " a buon intenditor poche parole"...

    Fabio
    Questo invece secondo me va convertito con UNIX_TIMESTAMP

    WHERE (ultimo_accesso+$set_timeout) > NOW()");
    Significa:
    codice:
    WHERE (ultimo_accesso+$set_timeout) > UNIX_TIMESTAMP(NOW())");
    La mia osservazione:
    codice:
    Oppure se ultimo_accesso e' un campo datetime: 
    
    WHERE (ultimo_accesso + interval $set_timeout minute) < NOW()");
    Ora l'unica controversia sarebbe l'uso di "> maggiore" oppure "< minore".

    Se vuoi estrarre tutti i record "scaduti" allora il confronto e': dove l'ultimo_accesso + il timeout e' minore di questo momento.

    Se vuoi estrarre i record ancora validi ovviamente l'opposto.

    Altra cosa degna di nota: Se un utente si collega senza concludere l'iter previsto, ti rimangono "orfani" tutti i record scaduti (timeout) o irraggiungibili per mancanza di session_id valido. Di qui la proposta di boomboom di cancellare non solo lo specifico session_id scaduto, ma bensi' "tutti" i session_id scaduti.

    Chiedi pure se non ti e' chiaro il discorso.

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

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.