2011-11-17 20 views
5

Qualcuno potrebbe spiegare gli svantaggi di memorizzare grandi quantità di dati all'interno della sessione o indicarmi una lettura?Sessioni: limiti dimensioni sessione

Sarei anche interessato se c'è qualche differenza tra la memorizzazione di dati in una sessione e la lettura di dati da file di dati?

+0

Vedere http://stackoverflow.com/questions/4649907/maximum-size-of-a-php-session http://stackoverflow.com/questions/217420/ideal-php-session-size – Mob

+0

Hai stato qui. Per favore smetti di firmare i tuoi post (E il tuo titolo dovrebbe _descrivere la domanda_, non elencare tecnologie e argomenti) –

risposta

4

Se si memorizza una grande quantità di dati in una sessione, si avranno riduzioni delle prestazioni di input/output poiché ci sarà molta lettura/scrittura.

Le sessioni in PHP, per impostazione predefinita, sono memorizzate nella directory/tmp in un file flat. Pertanto, i dati della sessione sono scritti in un file di dati di qualche tipo.

PHP consente di eseguire l'override del gestore di sessione predefinito tramite la funzione session_set_save_handler() in cui è possibile ridefinire il modo in cui le sessioni vengono lette/scritte/gestite.

È inoltre possibile eseguire l'override tramite il file php.ini in cui viene specificato tramite la direttiva session.save_handler.

Ora, l'implicazione di avere un gran numero di sessioni che memorizzano grandi dati è che molti file verranno creati e ci vorrà del tempo per trovarli a causa del modo in cui operano i dischi rigidi (quelli meccanici, ovviamente, che sono ancora quelli comuni). Più ne hai, più tempo è necessario per trovarlo. Più sono grandi, più tempo è necessario per leggerli. Se ne hai molti e sono grandi - il doppio del problema, è necessario un cambiamento di approccio.

Quindi qual è la soluzione?

Di solito, quando si verifica un calo delle prestazioni, le persone caricano il bilanciamento dei loro siti web. Sfortunatamente ciò non funziona con le sessioni perché il bilanciamento del carico sta scegliendo quale computer utilizzare che servirà la richiesta corrente. Ciò significa che diversi computer serviranno le pagine che navighi su qualche sito web. Il che significa che se questi computer utilizzano il meccanismo predefinito di archiviazione di sessione (directory/tmp), le sessioni non verranno conservate tra i server poiché non possono accedere alla directory/tmp di altri. È possibile risolvere questo problema montando un NAS e rendendolo globalmente visibile a tutti i computer nel cluster, ma è costoso e difficile da mantenere.

L'altra opzione è quella di memorizzare le sessioni in un database. Un database è accessibile da qualsiasi computer nel nostro cluster fittizio. Di solito, ci sono database specializzati utilizzati per la gestione delle sessioni, specializzati nel senso di essere separati dal database che memorizza il contenuto del tuo sito web o altro. Nel tempo della popolarità NoSQL - a mio parere, NoSQL è ottimo per la gestione delle sessioni. Scalano facilmente, sono più veloci nella scrittura dei dati sui dispositivi di archiviazione rispetto agli RDBMS.

La terza opzione è quella di potenziare tutto questo, abbandonare i dischi rigidi come soluzione di archiviazione permanente e utilizzare semplicemente la memoria del server per l'archiviazione delle sessioni. Quello che ottieni è una prestazione incredibile, tuttavia tutta la tua RAM potrebbe essere presto sparita. È anche possibile creare un cluster di computer che memorizzano le sessioni nella loro RAM. Redis e Memcache sono ottimi per questo compito, un po 'googlando un po' ti daranno buone risorse che spiegano come usare Redis o Memcache per memorizzare le sessioni.

La linea di fondo di tutto questo è: non memorizzare troppi dati nelle sessioni. In base alle tue esigenze e al tuo budget, ci sono 3 opzioni disponibili su come archiviare e lavorare con le sessioni.

1

Questo è un buon link: http://tuxradar.com/practicalphp/10/1/0

I dati di sessione è molto costoso carico di lavoro troppo. Il modo migliore per farlo è memorizzare un cookie, o session_id e usarlo per cercare quello che ti serve da un dbfile/rdbms. Ciò consente inoltre al tuo sito di funzionare in un ambiente multi-server dove i dati di sessione sono limitati a un singolo.