Newsgroup: it.comp.www.php
Titolo: Dove vengono memorizzate le variabili di sessione?

Come da oggetto, mi č venuto un dubbio:
quando in una pagina php imposto delle variabili di sessione, dove vengono 
memorizzate? E cosa viene inviato al client? Solo il PHPSESSID o tutte le 
variabili?
In particolare, utilizzo comunemente le sessioni (su PHP 5), e non mi son 
mai preoccupato di propagare "a mano" il session_id, dovendolo ad esempio 
incorporare nell'url. In questo caso, come comunicano client e server sul 
fatto che si sta utilizzando una sessione?
Sul manuale tutto ciň non č poi chiarissimo.
rob4you 

 Sul manuale tutto ciò non è poi chiarissimo.
Ti fa salvare un cookie con un id "unico", e salva tutte le variabili 
associate a quell'id in un file in una cartella privata (definita nel 
php.ini penso).
Infatti se disattivi i cookie o non ti funziona la sessione, oppure (a 
seconda del setting presumo) introduce l'id in tutti i link automaticamente.
ciao,
Luca(riello)

 PHPSESSID o tutte le variabili?
Le variabili di sessione vengono serializzate e memorizzate in un file
di testo dentro a una cartella posta *sul server*. Il percorso di
tale cartella è determinato dalla direttiva session.save_path.
Se, per esempio, creassi una variabile di sessione di nome var_ses,
contenente la stringa `prova`, sul server verrebbe salvato un file di
testo contente una stringa tipo la seguente:
 
 var_sess|s:4:"test";
il cui significato è piuttosto evidente: la variabile var_sess è una
stringa (s) di 4 caratteri pari a "test".
Se oltre a essa memorizzassi anche una seconda variabile, di nome
var_sess2, contenente il numero intero 100, allora verrebbe salvata la
stringa:
var_sess|s:4:"test";var_sess2|i:100;
Questo file avrà un nome simile a
`sess_3d048a150181e33a2ded3a55bfb91da9`, dove la sequenza di numeri e
lettere rappresenta il session_id. Per poter recuperare le variabili
salvate in sessione è quindi necessario propagare da una pagina
all'altra il session_id e per fare ciò esistono diverse strade.
Se la direttiva session.use_cookies fosse impostata su 1 e il client
fosse abilitato a memorizzare i cookie di sessione, allora sul client
verrebbe creato un cookie contenente proprio il session_id. In questo
caso, ogni pagina che facesse uso delle sessioni potrebbe recuperare
il session_id direttamente dal cookie e, una volta recuperatolo, il
PHP metterebbe a disposizione le variabili di sessione, memorizzate
nel corrispondente file, attraverso il superglobal array $_SESSION.
Se il client non permettesse la memorizzazione dei cookie o la
direttiva session.use_cookies non fosse impostata su 1, allora la
propagazione del session_id sarebbe demandata alla direttiva
session.use_trans_sid. Se tale direttiva fosse impostata su 1, allora
il PHP provvederebbe a propagare il session_id in modo automatico,
appendendolo come parametro (con il nome di default di PHPSESSID,
determinato dalla direttiva 
session.name
) in tutti i link relativi,
aggiungerebbe in tutti i form che inviassero dati a pagine del sito
un campo hidden con il session_id e così via in modo da propagarlo da
una pagina all'altra. La direttiva url_rewriter.tags stabilisce quali
TAG, in questo specifico caso, il PHP deve coinvolgere per garantire
la propagazione del session_id.
Se la direttiva session.use_trans_sid fosse impostata su 0 e non fosse
possibile utilizzare i cookie, allora sarebbe necessario aggiungere
manualmente il session_id a tutti i link, form, ecc. Per fare ciò
sarebbe possibile utilizzare la costante SID, la quale, dopo aver
avviato una sessione con session_start(), contiene una stringa simile
a `PHPSESSID=3d048a150181e33a2ded3a55bfb91da9`. Alternativamente,
sarebbe anche possibile prevedere un proprio sistema di
memorizzazione e propagazione del session_id (magari salvandolo in
una tabella di un database) anche attraverso l'uso di
session_set_save_handler().
Questo in linea di massima e salvo errori. Per ulteriori informazioni:
http://www.php.net/manual/it/ref.session.php
Ciao.
-- 
Federico

 
http://www.php.net/manual/it/ref.session.php
Grazie a te, e a Luca per le risposte precise e dettagliate.
Sei stato veramento chiarissimo.....roba da manuale! Ma lo hai inventato tu 
il PHP per caso? ;-))
ciao, e grazie ancora!
rob4you 

 tale cartella è determinato dalla direttiva session.save_path.
Ho controllato il mio php.ini locale (Windows XP, PHP 5.1.2), ma la 
direttiva session.save_path è commentata.
A questo punto, dove vengono memorizzate le variabili di sessione in questo 
caso? Ah, ovviamente le riesco a utilizzare senza alcun problema, ma vorrei 
capire dove viene tenuta traccia.
rob4you 

 vengono memorizzate le variabili di sessione in questo caso?
Bella domanda! Soprattutto perché fino ad oggi non me l'ero posta,
dando per scontato che si sarebbe sollevato un errore. Invece, come
hai giustamente riportato, le sessioni continuano a funzionare,
almeno su WindowsXP.
Comunque, ho trovato il file in questione (sess_*) nella cartella
C:\WINDOWS\Temp, suppongo quindi che in questa circostanza PHP
utilizzi la cartella temporanea definita attraverso le variabili
d'ambiente del sistema operativo, cioè %SystemRoot%\temp che di
default è, per l'appunto, C:\WINDOWS\Temp.
Su altri sistemi operativi non ho esperienze, per cui posso soltanto
immaginare che avvenga qualcosa di simile, ma potrebbe anche darsi di
no e magari potrebbe sollevarsi un errore. Non sono riuscito a
trovare un riferimento ufficiale che descrivesse nel dettaglio questa
situazione.
-- 
Federico

 default č, per l'appunto, C:\WINDOWS\Temp.
Hai ragione.....ho trovato anche io i file in questione nella cartella Temp 
di Windows.
Sai una cosa perň? Sono presenti in questa cartella circa trenta file di 
quel tipo (sess_***), ma sono tutti VUOTI, ad eccezione di uno, che contiene 
esattamente le informazioni come tu stesso le hai descritte in un messaggio 
precedente.
Perché vuoti? Forse perché nella mia procedura di logout azzero l'array 
delle variabili di sessione con $_SESSION=array()?
Certo che immaginando un sito a cui hanno accesso migliaia (milioni) di 
utenti diversi......ci sarebbero una marea di file del tipo sess_***.....un 
bel casino!!
rob4you 

 bel casino!!
http://it.php.net/manual/it/ref.session.php
in particolare (ma una lettura generale e' d'obbligo) le
direttive:
session.gc_probability
session.gc_maxlifetime

 sess_***...
È stata prevista una routine automatica, appunto la `garbage
collection`, per ripulire la cartella dai file relativi a sessioni
scadute. La `garbage collection` è influenzata dalle direttive: 
session.gc_maxlifetime 
session.gc_probability
session.gc_divisor
A grandi linee, la prima direttiva stabilisce dopo quanti minuti i
dati di una sessione debbano considerarsi `garbage`. Il valore di
default è 1440. Le altre due determinano la probabilità con cui il
processo di pulizia viene eseguito ad ogni avvio di una sessione. Il
valore numerico della probabilità è dato da
session.gc_probability/session.gc_divisor, i cui valori di default
sono rispettivamente 1 e 100.
Se i dati di sessione venissero salvati in una cartella impostata
tramite session.save_path la `garbage collection` non avrebbe luogo
automaticamente e quindi occorrerebbe prevedere un sistema di pulizia
automatico tramite script.
-- 
Federico

 session.gc_maxlifetime
Nel mio php.ini è impostata a 1440.
La cartella Temp tiene traccia di file sess_*** vecchi del 26 giugno (e 
ovviamente anche piu recenti, fino ad arrivare al 14 luglio).
Io non parlo della ripulitura del contenuto del file, ma della RIMOZIONE del 
file.
Cosa significa ciò, che la CANCELLAZIONE "fisica" del file può esser fatta 
solo a mano?
rob4you

 
evidentemente non hai dato la "lettura generale"

 evidentemente non hai dato la "lettura generale"
session.gc_maxlifetime specifica il numero di secondi dopo i quali i dati 
saranno considerati 'spazzatura' e cancellati.
A me è impostato a 1440 (secondi)......che se non erro, con un 
difficilissimo calcolo, corrispondono a 24 minuti.
ma....si parla di cancellazione dei DATI, mai di cancellazione dei FILES. Si 
intende la stessa cosa nel manuale?
Quindi la mia domanda resta sempre a stessa.
rob4you 

 
vengono cancellati i file sess_*
(un consiglio: leggi sempre la documentazione in inglese, e' quella piu'
aggiornata e scusami se ti ho indirizzato alla versione in italiano)
http://it.php.net/manual/en/ref.session.php
ti posto la parte mancante nella documentazione tradotta
     Note:  If different scripts have different values of 
session.gc_maxlifetime but share the same place for storing the session 
data then the script with the minimum value will be cleaning the data. 
In this case, use this directive together with session.save_path.
     Note: If you are using the default file-based session handler, your 
filesystem must keep track of access times (atime). Windows FAT does not 
so you will have to come up with another way to handle garbage 
collecting your session if you are stuck with a FAT filesystem or any 
other filesystem where atime tracking is not available. Since PHP 4.2.3 
it has used mtime (modified date) instead of atime. So, you won't have 
problems with filesystems where atime tracking is not available.
   teoricamente non dovresti avere i problemi relativi al filesystem 
FAT, ma evidentemente non e' cosi' ....
   IMO questo server IIS non e' configurato correttamente


Grazie....in effetti in lingua originale è sempre piu completo.
rob4you