Discussione:
Dove vengono memorizzate le variabili di sessione?
(troppo vecchio per rispondere)
rob4you
2006-07-13 17:43:08 UTC
Permalink
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
Luca(riello)
2006-07-13 17:58:37 UTC
Permalink
Post by rob4you
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.
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)
Federico
2006-07-13 20:42:35 UTC
Permalink
Post by rob4you
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?
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
rob4you
2006-07-14 00:19:28 UTC
Permalink
Post by Federico
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.
[super-CUT]
Post by 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
rob4you
2006-07-14 18:51:49 UTC
Permalink
Post by Federico
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.
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
Federico
2006-07-14 21:05:53 UTC
Permalink
Post by rob4you
Post by Federico
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.
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?
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
rob4you
2006-07-14 21:31:45 UTC
Permalink
Post by Federico
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.
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
hk3project
2006-07-15 06:42:25 UTC
Permalink
rob4you ha scritto:
[snip su file di sessione]
Post by rob4you
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!!
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
rob4you
2006-07-15 09:58:30 UTC
Permalink
Post by hk3project
session.gc_probability
Nel mio php.ini è impostata a 1.
session.gc_divisor=1000
Post by hk3project
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
hk3project
2006-07-17 07:15:01 UTC
Permalink
Post by rob4you
Cosa significa ciò, che la CANCELLAZIONE "fisica" del file può esser fatta
solo a mano?
evidentemente non hai dato la "lettura generale"
rob4you
2006-07-17 08:37:33 UTC
Permalink
Post by hk3project
Post by rob4you
Cosa significa ciò, che la CANCELLAZIONE "fisica" del file può esser
fatta solo a mano?
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
hk3project
2006-07-17 09:06:00 UTC
Permalink
Post by rob4you
Post by hk3project
Post by rob4you
Cosa significa ciò, che la CANCELLAZIONE "fisica" del file può esser
fatta solo a mano?
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.
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
rob4you
2006-07-17 09:16:21 UTC
Permalink
Post by hk3project
Post by rob4you
session.gc_maxlifetime specifica il numero di secondi dopo i quali i dati
saranno considerati 'spazzatura' e cancellati.
vengono cancellati i file sess_*
Capito, a questo punto mi viene il dubbio (parlo della mia situazione in
locale, Apache 2.0+PHP 5.1.2):
WinXP (quindi filesystem NTFS);
file di sessione, per default, memorizzati in C.\Windows\Temp;
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440

Perché io trovo ancora files sess_** datati 26 giugno 2006? Per giunta tutti
vuoti, ad eccezione di uno, datato 27 giugno.
Post by hk3project
(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
Grazie....in effetti in lingua originale è sempre piu completo.


rob4you

Federico
2006-07-15 07:12:26 UTC
Permalink
Post by rob4you
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()?
Direi di sì. Tieni presente che ogni volta che avvi una sessione si
crea un file di quel tipo. Quando fai il logout o quando chiudi il
browser, la sessione viene considerata scaduta e quindi, se riavvi
una sessione viene creato un nuovo file. Quello vecchio non viene
eliminato subito. Per questo c'è la `garbage collection`.
Post by rob4you
Certo che immaginando un sito a cui hanno accesso migliaia (milioni)
di utenti diversi......ci sarebbero una marea di file del tipo
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
Loading...