2011-05-03 12 views
8

Necesito almacenar muchas matrices en $_SESSION para evitar recuperar información de MySQL. ¿Está bien? ¿Cuánto es información "demasiado" en $_SESSION o no hay "demasiado"? Gracias.

P.S. ¿O es mejor usar http://php.net/manual/en/book.memcache.php?

+0

¿Qué quiere decir con "muchos" arreglos? 1, 10 100, 1k o 100k? – Shoe

+0

@Charliepiga: hasta 100, supongo. –

Respuesta

3

El límite de datos que puede almacenar dentro de una sesión está limitado por la capa de almacenamiento de la sesión. El almacén de sesiones predeterminado es el sistema de archivos y una sesión se almacena en un archivo. El nombre de la variable de sesión/matriz-matriz se almacena, así como sus datos en un serialized form. Un símbolo de tubería separa nombres de variables y valores entre sí.

Si está almacenando matrices con cadenas, el archivo será similar a la longitud de las cadenas más la longitud de las teclas y un poco de sobrecarga para los metadatos, así como el tamaño de los nombres de las variables.

El tamaño de un archivo está limitado por el sistema de archivos. Por ejemplo, en EXT3 esto es 16 Gigabytes por archivo.Entonces este es uno "demasiado". No puede almacenar más datos en una sesión de lo que la capa de almacenamiento le permite.

El siguiente límite que puedo pensar es el de su memoria. Como PHP necesita cargar los datos del archivo en la memoria y almacenarlos de la memoria en el archivo al final de la solicitud. Entonces, si tiene un memory limit in PHP, esto también limitará el tamaño de su sesión. Por ejemplo, hay un límite de memoria estándar de 16 MB en PHP 5.2, pero esto puede variar con su instalación.

El uso de toda la memoria para la sesión no tiene mucho sentido por cierto.

Al lado de estos límites duros podría haber límites de rendimiento que están relacionados con el número de solicitudes congurent, la velocidad de su disco duro es etc.

medida que su pregunta es bastante corto Asumo que no surge algún problemas concretos hasta el momento, por lo que creo que estaría fuera de alcance. P.ej. el uso de memcached si no lo necesitas realmente sería solo una sobrecarga. Además de discutir las decisiones de diseño (nunca almacenar en caché las sesiones) que no se pueden responder en general.

Los 100 o 200 Kilobytes por sesión (localice el directorio de la sesión en su sistema y tenga en cuenta el tamaño de los archivos) no deberían romper su programa. Como se sugiere, debe tener cuidado de que los archivos de sesión antiguos que ya no se necesitan se eliminen automáticamente después de un cierto período de tiempo.

Para obtener más información sobre la configuración de la sesión en PHP, consulte Session Runtime Configuration in the PHP Manual.

1

$ _SESSION es no para el almacenamiento en caché.

Si necesita almacenar en caché cosas, entonces use APC, o Memcached o incluso Redis.

+1

Explica por qué por favor –

+0

"El módulo Memcache también proporciona un controlador de sesión (memcache)." - Manual de PHP. Solo digo ... – Shoe

+5

Esta respuesta no explica _por qué_, que es lo que pregunta. –

1

La cantidad de datos en la sesión tendrá un efecto sobre el rendimiento. Si tiene la intención de utilizar archivos para la sesión, tenga en cuenta que php podría golpear un cuello de botella en el disco. Leer, escribir y serializar esos datos puede incurrir en un disco pesado de E/S, lo cual es malo.

En cuanto a un límite superior difícil, sospecho que esos límites son los mismos que los del sistema de archivos. Por ejemplo, si guarda cantidades masivas de datos en una sesión y llena su disco, no podrá escribir sesiones adicionales.

El uso de memcached aliviará los problemas de rendimiento de E/S del disco, ya que escribir y leer desde memcached es mucho más rápido. Sus límites serán de 1 MB por sesión, según las especificaciones de memcached. El espacio total para las sesiones será el tamaño de la instancia de Memcache que inicie (dictada por el indicador -m al iniciar la instancia de Memcache).

3

Mucho de lo que pregunta depende de cuántos usuarios está esperando y el tipo de hardware que usa. Asumiendo que su configuración de PHP está usando el almacenamiento de archivos para la información de la sesión (por defecto), y tiene mucho espacio de tmp, se pueden almacenar grandes cantidades de datos en la sesión.

Personalmente he almacenado una docena de objetos de datos (normalmente resultados de bases de datos que pertenecen al usuario) en las sesiones. El sitio estaba en una Intranet de la compañía y atendía unas diez mil solicitudes por hora. Fue rápido y la carga fue baja. Si tuviera que adivinar, cada sesión estaba cerca de 100 KB.

No recomendaría almacenar mucho más que un megabyte o dos en una sesión. También deberá asegurarse de que PHP y Apache (IIS, lo que sea) estén limpiando después de ellos también. Si almacena una gran cantidad de datos de sesión, el espacio temporal se llenará rápidamente.

Si realmente quieres hacer algo como esto increíblemente rápido, y tener el efectivo, ve por una unidad de disco SSD. Eso haría que la recuperación sea aún más rápida.

Espero que esto ayude.

+2

Solo tenga cuidado con los discos SSD, Jeff Atwood (@CodingHorror) tiene una excelente publicación de blog con respecto a las SSD y la tasa de fallas ... http://www.codinghorror.com/blog/2011/05/the-hot-crazy-solid -state-drive-scale.html –

+0

De acuerdo. Solo tienen tantos ciclos de escritura. No recomendaría usar una SSD como unidad principal para un dispositivo (a menos que el dispositivo sea desechable), y siempre mantenga una copia de seguridad de todo lo que no pueda soportar que esté almacenado en la unidad (por supuesto, esa es una buena práctica de todos modos) – Chad

Cuestiones relacionadas