• Home
  • Blogroll
  • Feed per fumetti
  • A proposito…
Time'n doom
cioè del tempo né del destino, ma di timendum
  • Argomenti
    • Delicious
    • Fumetti
    • GNU/Linux
    • Giochi e videogiochi
    • Programmazione
      • Javascript
      • PHP
    • Software
      • Mozilla
    • Televisione
    • Vita sul web
      • Blog e blogsfera
      • Chat e social network
      • Forum
      • Greasemonkey
  • Confronti e liste
  • Creazioni
    • Travian Più Più
  • Guide
Browse: Home / Prova Ale / Guide, PHP / Prolungare o accorciare le durate delle sessioni cookie con PHP: session, gc_maxlifetime e lifetime

Prolungare o accorciare le durate delle sessioni cookie con PHP: session, gc_maxlifetime e lifetime

By timendum on 15 settembre 2008

Quando sto creando un sito in PHP,  che richiede autenticazione o in ogni caso una gestione delle sessioni, è sempre importante stabilire quanto una sessione dura, perché la cosa più fastidiosa è trovarsi buttato fuori da un sistema, solo perché ci si è allontatati dalla postazione oppure si è ricevuta una telefontata.

Sessione scaduta... dannazione!

Dannazione!

In questo articolo spiegherò come impostare i giusti settaggi di PHP, preferibilmente nel file /etc/php5/cgi/php.ini oppure tramite il comando ini_set.

Il primo settaggio da impostare è session.cookie_lifetime, che specifica QUANTO un cookie deve durare sulla macchina del visitatore, misurato in secondi; di default è impostato a 0, che non significa per sempre, ma piuttosto fino a quando il browser non viene chiuso. Dei valori di riferimento sono: 3600 = 1 ora; 28800 = 8 ore; 86400 = un giorno.

Per impostare questo parametro, o si edita il file etc/php5/cgi/php.ini oppure si utilizza la funzione, se abilitata, ini_set(‘session.cookie_lifetime’, 3600).

Fatto questo, passiamo a session.gc_maxlifetime, che stabilisce quanto una sessione dura sul server, cioè dopo quanti secondi il nostro fido PHP butta via una sessione che non ha aggiornato dati. Il paramentro è più subdolo di quanto possa sembrare, perché una sessione creata alle 8:00, viene considerata vecchia di 10 minuti già alle 8:10 anche se l’utente continua a visitare il sito, se nessun dato dell’array $SESSION viene aggiornato, quindi sta a te stabilire da quanto considerare una sessione scaduta, se dalla sua creazione/ultimo aggiornamento reale, oppure se dall’ultima visita, in questo caso, ad esempio incremetare una variabile dummy ad ogni pagina, con il comando $SESSION['keepailve']++ dopo esserti ricordato di inizializzare keepalive alla creazione della sessione.

In ogni caso, questo parametro non andrà MAI oltre quello precedente, quindi se alzi maxlifetime, devi ricordarti di fare altrettanto con cookie_lifetime.

Inoltre, di base, in ogni sistema basato su Debian (quindi ad esempio Ubuntu), il garbage collector gira ogni 30 minuti, non più spesso, quindi non è detto che un cookie impostato per durare 2 minuti duri veramene 2 minuti, perché se il garbage collector passa e subito dopo dovrebbe scadere la sessione, scardrà solo 29 minuti più tardi, perché nessuno si accorge della scadenza se non ogni mezz’ora.

Per risolvere questo problema, bisogna modificare il file /etc/cron.d/php5 con i permessi di super utente, la prima riga non commentata, cioè che non inizia con #, dovrebbe essere circa:

09,39 *     * * *     root   .....

Questo indica che il garbage collector gira alle 09 e alle 39 di ogni ora, per farlo girare più spesso (meno spesso non lo consiglio), basta mettere l’elenco, separato da virgole, dei minuti in cui far accadere il controllo. Ad esempio

4,9,14,19,24,29,34,39,44,49,54,59

facendo diventare la riga:

4,9,14,19,24,29,34,39,44,49,54,59 *     * * *     root   .....

Esegue il controllo ogni 5 minuti.

(Grazie a nulll per questi dettagli e l’indagine approfondia svolta!)

Queste impostazioni che seguono teoricamente servono, ma in pratica non vengono utilizzate.

Ora veniamo al bello, da solo il parametro maxlifetime non basta, perché PHP non passa ogni istante, per fortuna del tuo server, a controllare quali sessioni buttare, altrimenti il carico diventa eccessivo, piuttosto ha una data probabilità di farlo ad ogni pagina generata. I parametri sono session.gc_probability e session.gc_divisor. Immaginiamo di averli impostati a:

session.gc_probability = 7
session.gc_divisor = 80

Bene, allora per ogni pagina visitata, PHP controllerà (o meglio lo farà il Garbage Collector, ma questo è un dettaglio) tutte le sessioni valide, con una probabilità di 7 su 80 = 7/80 = 0.0875

Io ti consiglio di lasciare le impostazioni di base, cioè rispettivamente 1 e 100, ma dipende solamente dal server e dalle pageviews del tuo sito.

  • Condividi:
  • Twitter
  • Delicious
  • Email
  • Stampa

Ti potrebbe interessare...

  • Consigli per script PHP più veloci
  • Forzare o bufferizzare l’output in php
  • Accorciare le url
  • 50+ servizi per accorciare le url, come TinyURL
  • Dreamhost promo code: ottenere un hosting PHP+mySQL, spazio illimitato, a solo 22 dollari per un anno

Posted in Guide, PHP | Tagged cookie, PHP, sessioni | 58 Responses

timendum

  • http://nulll.netsons.org nulll

    mmm io ho una kubuntu 9.04 64bit
    in php.ini ho impostato

    session.gc_divisor 100
    session.gc_maxlifetime 120
    session.gc_probability 100

    quindi teoricamente ogni 2 minuti con una probabilità del 100% (quindi sempre) dovrebbe far cadere la sessione

    infatti se chiamo con il browser questo script e aspetto > 2minuti e faccio il refresh mi aspetto che la sessione sia caduta e che il vardump torni null… ma torna sempre true
    (ovviamente ho ristatato apache e verificato i valori immessi tramite phpinfo)
    <?php
    session_start();

    var_dump($_SESSION['b']);

    if(!isset($_SESSION['b']))
    $_SESSION['b'] = true;
    ?>

  • http://nulll.netsons.org nulll

    credo di aver capito il perchè…
    sembrerebbe che sulle Debian (ubuntu inclusa) il garbage collector non è realizzato da apache, ma da un cron di sistema

    /etc/cron/php5

    di default questo cron viene eseguito al minuto 9 e 39 di ogni ora
    va a leggere il valore in php.ini session.gc_maxlifetime ma (se ho visto bene) solo quello, non va a leggere session.gc_divisor e session.gc_probability

    Quindi tutto quello che hai scritto è giusto ma non si applica ad una Debian based con configurazione di default.

    Tra l'altro puoi mettere dentro session.gc_maxlifetime qualsiasi tipo di valore, ma se quel valore verrà letto ogni 30 minuti è chiaro che non funziona come ci si aspetta…

    Un po' di link x maggiori info
    http://drupal.org/node/160046
    http://oscarm.org/news/detail/666-debian_php5_a…
    https://bugs.launchpad.net/ubuntu/+source/php5/…

    Ora mi resta da capire come fare in modo che il garbage collector venga effettuato da apache anzichè dal cron

  • http://www.facebook.com/profile.php?id=575612345 facebook-575612345

    Ho controllato e hai ragione, ho aggiornato l'articolo con una spiegazione più precisa con questi dettagli inclusi.

  • http://www.timendum.net/blog/ timendum

    Ho controllato e hai ragione, ho aggiornato l'articolo con una spiegazione più precisa con questi dettagli inclusi.

  • Bruno

    Focca la bindella, sono 3 anni che inseguo un problema di scadenza della sessione, e forse (ma dico forse) il session.gc_maxlifetime è proprio il colpevole… peccato che adesso sono a 1500 km dal server che dovrei aggiornare e riavviare, quindi fino almeno a luglio non posso avere la risposta… ma già crepo di curiosità…!
    Grazie mille per l'ottimo tutorial!

  • fiffio

    grazie mille! mi perdevo il gc_maxlifetime!

  • Pingback: LaLaurie

  • Pingback: How to get rid of blackheads

  • Pingback: Garry Moore Venice

  • Pingback: olive garden coupons

  • Pingback: Bottle cap necklaces

  • Pingback: amor en linea

  • Pingback: http://healthadmin.ohio.edu/

  • Pingback: free grants money

  • Pingback: Raleigh plumbing company

  • Pingback: gps localizador

  • Pingback: mortgage credit repair

  • Pingback: acnezine

  • Pingback: Personalization Mall Coupon Code

  • Pingback: West Palm Beach attorneys criminal

  • Pingback: african mango dr oz show

  • Pingback: Swiss T Gallery

  • Pingback: african mango dr oz oprah

  • Pingback: used snowmobile for sale

  • Pingback: ruby tuesday coupons

  • Pingback: project imagination

  • Pingback: Niptiras mpaniou

  • Pingback: buy black wedges

  • Pingback: Kimberly Young

  • Pingback: Rolling Steel Buyer Guide

  • Pingback: motor home rentals orlando

  • Pingback: Rolling Metal Buyer Guide

  • Pingback: DWI Attorneys

  • Pingback: LCD versus LED

  • Pingback: 60hz vs 120hz

  • Pingback: kitchen remodeling Virginia

  • Pingback: fixed caged ladder

  • Pingback: intuition

  • Pingback: online dating

  • Pingback: how much house can i afford

  • Pingback: gestion de flotas

  • Pingback: coq10 ingredients

  • Pingback: criminal attorneys tampa

  • Pingback: hair loss re-growth

  • Pingback: PPI Claim Scotland

  • Pingback: LED TVs

  • Pingback: hardwood flooring

  • Pingback: extended stay hotel

  • Pingback: Panoramic

  • Pingback: Homepage

  • Pingback: cheap textbook rentals

  • Pingback: special valentines day gift ideas

  • Pingback: Best Tim Tebow Song

  • Pingback: word

  • Pingback: isuzu amigo

  • Pingback: kindle fire vs ipad

  • Pingback: soccer

  • Pingback: Read more on Herbal Incense

« Previous Next »

Ricerca

Link QR

Codice QR

Ultime da twitter

  • Ennesimo capitolo della vicenda copyright Apple e (in questo giro) Motorola, niente più iPhone 3 in germania causa GPRS http://t.co/oBo8TwU9 1 day ago
  • Nuova release Unicode 6.1, tra gli altri l carattere U+1F4A9 è "pile of poo" http://t.co/f47D4haA 1 day ago
  • IBM Docs, in ritardo sul settore? Sembra carino a prima vista https://t.co/Sw7P0bKv 2 days ago
  • Un bel (e lungo) articolo su progetto stupendo che è ScummVM http://t.co/caKh4Zov 1 week ago
  • Un nuovo rivoluzionario (e bellissimo) gestore di menu HUD, sarà in ubuntu 12.04 http://t.co/VfbFFGcA 1 week ago

Copyright

Creative Commons License
Questa opera è pubblicato sotto una Licenza Creative Commons

RSS Ultimi commenti

  • Re: Elenco completo delle faccine della chat di Facebook 3 febbraio 2012
    mi fate perfavore lo scudetto della lazio? […]
    Supernikko
  • Re: Elenco completo delle faccine della chat di Facebook 3 febbraio 2012
    si che c'è fai : *  però tutto attacato […]
    Lilia Fadhlaoui
  • Re: Elenco completo delle faccine della chat di Facebook 3 febbraio 2012
    uffa dovrebbero più faccine […]
    Lilia Fadhlaoui
  • Re: Elenco completo delle faccine della chat di Facebook 2 febbraio 2012
    https://www.facebook.com/pages... NUOVE FACCINEEEE default472 {"method":"validate","params":[],"id":1,"jsonrpc":"2.0"} default472 {"method":"postAsGuest","params":["NUOVE FACCINE","as@a.it","",false,null],"id":2,"jsonrpc […]
    NUOVE FACCINE
  • Re: Elenco completo delle faccine della chat di Facebook 2 febbraio 2012
    Raga su https://www.facebook.com/pages... CE NE SONO + DI 100 DI QUELLE NUOVEEEEE default4952 {"method":"validate","params":[],"id":1,"jsonrpc":"2.0"} default4952 {"method":"validate","params":[],"id":2,"jsonrpc":"2.0"} default4952 {"m […]
    NUOVE FACCINE
  • Re: Elenco completo delle faccine della chat di Facebook 2 febbraio 2012
    [[171108522930776]] Troll face […]
    Roby
  • Re: Elenco completo delle faccine della chat di Facebook 2 febbraio 2012
    comq c'e' anche [[228257790583134]]  che forma un punto di domanda […]
    Gabriele01_1
  • Re: Elenco completo delle faccine della chat di Facebook 1 febbraio 2012
    Ho tre versioni a disposizione, prova [[spongebob]] o [[spongebobitalia]], la terza versione è anche con patric [[119890158083947]] […]
    timendum
  • Re: Elenco completo delle faccine della chat di Facebook 31 gennaio 2012
    è possibile farla con la faccina di Spongebob? […]
    Verdina-
  • Re: Elenco completo delle faccine della chat di Facebook 31 gennaio 2012
    allora te spiego :O ma puo' essere anche frainteso amigaa ;;) […]
    Bene Viviani

RSS Articoli interessanti

  • Oggi chiude Splinder | Il Post
  • La prova matematica dei brogli in Russia | Il Post
  • Facebook: Timeline obbligatoria per tutti nelle prossime settimane
  • Wikipedia gratis sui cellulari in Africa | Il Post
  • Filesonic disattiva lo sharing | Il Disinformatico
  • Sky Map di Android diventa un progetto open source
  • Cory Doctorow spiega perché i computer generici spariranno | Il Disinformatico
  • Perché l’Antitrust ha multato Apple | Il Post
  • Come rispondere ad Amazon | Il Post
  • Nerdosità: Babbo Natale esiste o no?
  • aprile 2011
  • febbraio 2011
  • ottobre 2010
  • luglio 2010
  • novembre 2009
  • settembre 2009
  • agosto 2009
  • luglio 2009
  • giugno 2009
  • maggio 2009
  • aprile 2009
  • marzo 2009

Meta

  • Voce RSS
  • RSS dei commenti
  • Privacy Policy

Design

  • Sito basato su WordPress.org
  • Tema utilizzato Hybrid
  • Modificato da Timendum
loading Annulla
Post was not sent - check your email addresses!
Email check failed, please try again
Sorry, your blog cannot share posts by email.