Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Gestione della sessione: session_set_save_handler

    Salve a tutti, sto cercando di implementare una gestione della sessione tramite session_set_save_handler , solo che nn riesco a far funzionare la funzione gc .

    Lo scopo è quello di consentire un accesso unico ad un determinato profilo, per cui nella fase di login marco il relativo record nella tabella MySql corrispondente inserendo il session_id , funziona tutto correttamente se l'utente effettua il logout, ma se per qualche motivo si disconnette o cade, la funzione gc nn entra in funzione.
    Ho eseguito alcune verifiche richiamando la gc definita da me dalla funzione destroy definita per session_set_save_handler e funziona correttamente. Ho abbassato il max_life_time , nulla! Sembra che la gc nn venga richiamata.

    Un'alternativa sarebbe quella di avere una funzione che controlla se un determintato sid è connesso, ma nn trovo nulla del genere in PHP.

    Qualcuno ha un'idea?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    34
    non so se ho capito bene!

    Ma se ho capito tu non puoi sapere se un utente è collegato!

    Mi spiego. Uno script ha una vita breve. Il browser fa una richiesta lo script la esegue poi muore. Insomma i collegamenti tra browser e scripi sono, come dire, a singhiozzi.

    L'unica cosa che si può fare e considerare un utente attivo se tra una richiesta ed un'altra passa meno di xx tempo.

    La gc entra in funzione solo in determinati casi (non denterminabili) e serve a fare pulizia delle sessioni scadute.

  3. #3
    temo che hai ragione! Approfondendo l'argomento mi trovo in effetti davanti a questo problema: la gc nn viene richiamata ogni volta che una sessione muore, ma secondo una percentuale di probabilità definite dai parametri gc_probability e gc_divisor.... (normalmente impostati 1/1000) e credo sia molto sconsigliato modificarli per nn caricare il server. In ogni caso a me servirebbe 1/1 per la certezza inquanto, trattandosi di un monitor riservato per la gestione di un sito, nn si prevede un numero di accessi tali da rendere probabile la gc!



    Avrei bisogno di una funzione che cerca, tra le sessioni attive, un determinato SID su richiesta, se nn sbaglio in ASP c'era qualcosa del genere, ma non trovo nulla di analogo in PHP.

    Grazie comunque dell'aiuto

  4. #4
    Non si e' capito bene pero' il tuo problema.

    La sessione ha una durata. Puo' decadere per tre ragioni.

    1) lato user perche' viene chiuso il browser o cancellato il cookie di sessione.

    2) Lato server per time-out di inattivita' stabilito da max_life_time

    3) Lato server se la sessione viene distrutta.

    Il fatto che il file di sessione sia presente non significa che sia valido, in gc e' come se non esistesse. Se tu inserisci il session_id in una tabella, poi questo dato lo devi gestire tu. Non viene gestito dalla sessione. Se inserisci l'ora di connessione o di ultima attivita' saprai se la sessione su file e' ancora valida o meno. Se valida potresti forzare l'id di sessione (con session_id(n.sessione) anche se lo user avesse chiuso il browser o cancellato il cookie.

    Ma dovresti essere certo che l'utente lo avrebbe voluto fare e non ripresentargli dati che forse non vorrebbe piu' vedere.


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

  5. #5
    Originariamente inviato da piero.mac
    Se tu inserisci il session_id in una tabella, poi questo dato lo devi gestire tu.
    Lo gestisco attraverso la funzione personalizzata session_destroy specificata in session_save_handler... vorrei farlo analogamente con session_gc sempre in session_save_handler, ma ho capito che nn viene sempre richiamata al termine di una specifica sessione ma random con una percentuale derivata dal rapporto tra i parametri gc_probability e gc_divisor... ho anche capito che nn conviene autmentare la frequenza di questa randomizzazione (a me servirebbe 1/1) inquanto ne risentirebbe il server.
    Non viene gestito dalla sessione. Se inserisci l'ora di connessione o di ultima attivita' saprai se la sessione su file e' ancora valida o meno.
    purtroppo inizio a pensare anche io che sia l'unica soluzione, ma nn mi andrebbe troppo bene inquanto l'applicazione cui sto lavorando prevede un tempo di sosta in una pagina anche abbastanza lunghetto quindi sarebbe difficile trovare un tempo significativo da considerare come termine di una sessione... potrei aggirare la cosa bluffando con degli autosave che aggiornino l'ultima azione forzatamente... ma spero di trovare qualcosa di più elegante
    Se valida potresti forzare l'id di sessione (con session_id(n.sessione) anche se lo user avesse chiuso il browser o cancellato il cookie.
    Potresti chiarirmi un attimo questa forzaturea dell'id_di sessione?
    In pratica spero che session_id(SID) mi restituisca true o false se SID è collegato o meno....[ma mi sembra di ricordare che non sia così semplicemente aggiunge il sid specificato]

  6. #6
    Originariamente inviato da teroweb
    Potresti chiarirmi un attimo questa forzaturea dell'id_di sessione?
    In pratica spero che session_id(SID) mi restituisca true o false se SID è collegato o meno....[ma mi sembra di ricordare che non sia così semplicemente aggiunge il sid specificato]
    dal manuale:
    session_id() restituisce l'id di sessione per la sessione corrente. Se id è specificato, sostituirà l'id di sessione corrente.
    Il ragionamento da fare sarebbe il seguente:

    session_start() apre una nuova o "recupera" una sessione esistente.

    come lo decide? leggendo il cookie dal browser. Se il cookie di sessione esiste cerca il file. Se lo trova valido lo apre, se non lo trova oppure lo trova ma scaduto per inattivita' apre una nuova sessione. E fin qui niente da fare. Avendo i dati salvati e in tempo valido, potresti sostituire la sessione aperta con quella memorizzata su db nel caso che chi avesse chiuso la sessione fosse il browser.

    Ma a questo punto perche' non fare il salto di qualita' e non usi le sessioni solo su db?

    Esiste un articolo di gm sulle "sessioni alternative". vedi se puo' fare al caso tuo.

    http://freephp.html.it/articoli/view_articolo.asp?id=97


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

  7. #7
    Mhhh temo di non essermi spiegato o non aver compreso qualcosa.
    L'ottimo articolo indicato evolve il concetto della sessione indubbiamente, ma opera analogamente a session_set_save_handler che consente di definire sei funzioni personalizzate per l'apertura, la lettura, la scrittura, la chiusura e la gc della sessione.
    In pratica si definiscono le sei funzioni (che io utilizzo implementando su un db MySql) schematicamente:
    codice:
    funcion s_open(){
    //TODO apertura sessione
    }
    function s_read(){
    //TODO lettura sessione
    }
    function s_write(){
    //TODO scrittura sessione
    }
    function s_close(){
    //TODO chiusura sessione
    }
    function s_destroy(){
    //TODO distruzione sessione
    }
    funcion s_gc(){
    //TODO garbage collection sessione
    }
    session_set_save_handler("s_open","s_read","s_write","s_close","s_destroy","s_gc");
    
    //la sessione parte regolarmente
    session_start();
    Il mio obiettivo è consentire un accesso unico ad un determinato profilo, se il profilo x è loggato e qualcun altro cerca di entrare con lo stesso account riceve un messaggio di arresto.

    Per fare questo inserisco il SID nella tabella di login in modo tale che l'utente possa loggare solo se il campo SID è nullo.

    Il problema è che in caduta della connessione (quindi non con procedura standard di logout che opera l'eliminazione del valore) il campo SID rimane pieno e quindi l'utente, rientrando, riceve comunque il blocco di accesso....dovrei far in modo che, se un utente trova il suo account loggato, prima di ricevere il blocco di accesso venga verificato se il SID è ancora collegato o meno!!!!

  8. #8
    Infatti avevo detto che ti serve una data-ora vuoi in timestamp vuoi in datetime... meglio timestamp in questo caso.

    Quando si connette verifichi user, id sessione, tempo ultima connessione. Se il tempo ultima connessione e' superiore a tot la sessione non e' piu' valida e si puo' connettere, se il tempo e' inferiore la sessione e' ancora valida e gliela riconosci.

    Mi baserei su questo valore per decidere se e' ancora da considerare loggato oppure no. Ovviamente ad ogni pagina che visita od una definita attivita' aggiorni il timestamp di presenza.

    Se uno stesso user si collega da piu' terminali non dovrebbe essere un problema... lo potrebbe anche fare aprendo diverse finestre del browser oppure utilizzare contemporaneamente piu' browser. Per esempio utilizzo firefox ed explorer e quando mi collego al forum devo identificarmi due volte, due sessioni diverse e stesso user.

    prima che il forum ti dichiari assente ci vogliono un paio di manciate di minuti. Il tempo che scada il time out dall'ultima lettura del cookie.


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

  9. #9
    Già, sembrerebbe l'unica soluzione percorribile... anche se non calza bene l'esigenza che devo risolvere.

    Il problema è come identificare il TempoX, l'applicazione che sto sviluppando è un monitor di gestione contenuti, quindi il tempo di permanenza in una pagina potrebbe essere anche lungo.

    Ipotizziamo di impostarlo a 30 minuti, se l'utente sta completando un articolo potrebbe accadere che stia su una pagina per un tempo superiore, nel frattempo un tentativo di accesso con lo stesso account sarebbe disponibile.
    Di contro ipotiziamo che per qualche ragione perda la connessione, dovrà aspettare 30 minuti per rientrare....

    Un po'poco funzionale direi. :rollo:

    In ogni caso grazie per i chiarimenti mi sono stati comunque utili almeno per circoscrivere il problema

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.