2011-05-21 18 views
6

Duplicar posibles:
Can't pass mysqli connection in session in phpEl almacenamiento de conexión de base de datos en una variable de sesión

Muchos de nosotros han escrito aplicaciones PHP que requieren las bases de datos; principalmente MySQL, pero a menudo he usado bases de datos muy pequeñas de MS Access para personas con menor capacidad técnica para que puedan descargarlas y guardarlas/guardar copias de seguridad/etc. por su cuenta (si esto es correcto o no, no tengo ni idea).

Lo que noto, es mucho tiempo dedicado a conectar y ejecutar algunas de las mismas consultas. Debido a esto, tuve una idea interesante: almacenar la conexión y los posibles conjuntos de resultados que son en su mayoría estáticos en una variable $_SESSION para reducir la carga a medida que el usuario navega por el sitio.

Obviamente hacerlo requiere mucha consideración. Cosas como cerrar la conexión cuando se destruye la sesión es solo el comienzo.

Mi pregunta se reduce a: ¿Esto es realmente posible? Y si es así, ¿qué debo saber (además de session fixation, ya que es su problema el que se aplica a todas las sesiones)?

Respuesta

10

Incluso si pudiera hacer esto (recurso vs. datos), esta es una mala idea. Concluirá con muchas conexiones simultáneas abiertas, que harán explotar sus conexiones máximas muy rápidamente ... especialmente si su ciclo de vida se expande más allá de los 100 ms (dependiendo de sus consultas) a 20 minutos o más. Con conexiones abiertas, algo así como MySQL tampoco podrá restablecer correctamente sus asignaciones de memoria, y todo el sistema se va a la mierda. En resumen, esto no es para lo que son los DB a menos que el único consumidor de su código sea un solo usuario.

Como alternativa, recomiendo encarecidamente las tecnologías de almacenamiento en caché que están diseñadas específicamente para reducir la carga de la base de datos y obviar los tiempos de conexión. Usando algo así como, en su forma más simple, memcached mejorará dramáticamente el rendimiento en todos los sentidos, y podrá especificar exactamente cuántos recursos del sistema ingresan en el caché, al mismo tiempo que permite que la base de datos haga su trabajo de obtener datos cuando lo necesita a.

+0

No pensé en el problema de conexión. Es por eso que pregunté :) – steveo225

+0

Mira a Memcached. Lo uso en sitios sin bases de datos incluso ... me permite construir una página PHP compleja una sola vez, y servirla todo el día (sin volver a procesar) unitl se invalida por un checkin de SVN. –

11

No es posible almacenar las conexiones de bases de datos o conjuntos de resultados en la sesión, ya que esos son recursos y:

Algunos tipos de datos no se puede serializar tanto almacenan en las sesiones. Incluye variables de recursos u objetos con referencias circulares (es decir, objetos que pasan una referencia a sí mismo a otro objeto).

http://php.net/manual/en/intro.session.php

se puede extraer un conjunto de resultados en una matriz normal y almacenar que en la sesión como cualquier otra variable. Ese sería un caso de uso bastante típico para las sesiones de todos modos. Solo tenga cuidado de no almacenar demasiados datos en la sesión, ya que puede ser más agotador que recuperarlo de la base de datos.

+0

Esta debería ser la respuesta aceptada. –

1

Deberías tener en un archivo de configuración para un mejor uso. Las sesiones son para sesiones específicas y no para globales.

Cuestiones relacionadas