2010-02-06 6 views
7

estoy usando la matriz de sesión para trozos de caché de la información obtenida de la base de datos:Sobrecarga de sesión: ¿qué es "demasiados datos" almacenados en una sesión en PHP?

$result = mysql_query('select * from table'); 
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result))); 

Mi pregunta es, ¿hay un límite/una cantidad considerable de información que puede/debe ser pasada alrededor en una sesión ? ¿Es poco aconsejable o significativamente obstaculizar el rendimiento para hacer esto?

+0

solo marque si usa db storage para la sesión verifique el tipo de datos y la longitud de la columna –

Respuesta

6

De manera predeterminada, los datos $ _SESSION se almacenan en el disco en el directorio/tmp de su servidor. Mientras tengas suficiente espacio ahí Y no estés alcanzando tu límite de memoria PHP, estás bien.

Sin embargo, si intenta almacenar en caché una consulta que es la MISMA para un número mayor de usuarios, puede utilizar algo como APC o Memcache que no esté vinculado al usuario individual. De lo contrario, esencialmente va a almacenar en caché el mismo resultado 1x para cada usuario, y no aprovechará un caché para todos los usuarios.

0

Dado que los datos de sesión se almacenan en un archivo (o registro de base de datos) en su servidor, no debería importar demasiado la cantidad de datos que almacena en él. Solo recomendaría contra objetos enormes.

Es posible que desee mirar APC o memcached para almacenar en caché los resultados, ya que no es un caché por usuario, y utiliza la memoria en lugar de archivos.

0

La sesión se serializa y se escribe en el disco de forma predeterminada, por lo que dependiendo del tamaño y la cantidad de usuarios, las cosas pueden volverse lentas. Sin embargo, ambas cosas se pueden cambiar (lea el manual de la sesión bajo http://php.net/session para más detalles) como usar Memcache para almacenar datos en la memoria. Lo mejor es probarlo en un entorno lo más similar posible al sistema en vivo y verificar la carga y el rendimiento resultante.

1

Creo que la respuesta dependerá de dónde está almacenando sus datos y qué tan rápido puede transferirlos allí.

Si la información es de 44 MB grande, y está en una red 1000base-T, puede esperar que demore 1 segundo para transferir realmente ALL. Y 1 segundo para transferir de nuevo ...

Si utiliza la memoria local, entonces tiene una cantidad limitada de memoria de la máquina.

Si usa el disco, entonces tiene tiempos de carga/guardado (el disco es lento).

Pero también tenga en cuenta que PHP tiene una cantidad finita de memoria que permite el uso de un script. Creo que la configuración predeterminada es 8 MB.

Si está hablando de grandes bloques de datos, es posible que desee considerar Redis, u otras tiendas clave/valor. O incluso una interfaz de fondo para manipular los datos/almacenarlos en caché sin transferirlos a través de PHP.

0

Mmm, difícil. Creo que podrías guardarlo en la sesión. La verdadera pregunta es: ¿quiere que toda esa información se serialice y extratermine cada vez que un cliente haga una solicitud? Creo que estaría bien guardarlo ahí si va a usar toda esa información en cada página de su sitio web, pero esto no es posible. Sería mejor si guarda esa información en un directorio como /temptables/sometable/ y cada archivo tiene el nombre de la sesión.Puede utilizar session_id conseguirlo, y guardar y cargar la información en las páginas que ha de usar con:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser')); 

y el ahorro con:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info)); 

pero se necesita un trabajo cron limpiar eso directorio para archivo viejo. Puede hacerlo obteniendo la sesión del nombre del archivo y solicitar alguna variable, como 'itsalive', usando session_start() o haciendo algo como file_exists(session_save_path().'/sess_'.$session_name) para verificar si debe eliminar el archivo temporal.

Cuestiones relacionadas