pdo - ejemplo - Conexiones de base de datos persistentes: ¿sí o no?
ejemplo conexion pdo mysql (7)
Crear conexiones a la base de datos es una operación bastante costosa. Las conexiones persistentes son una buena idea. En el mundo de ASP.Net y Java, tenemos "conexión de conexiones", que es más o menos lo mismo, y también una buena idea.
Estoy usando la capa PDO de PHP para el acceso a datos en un proyecto, y he estado leyendo y viendo que tiene un buen soporte innato para las conexiones de bases de datos persistentes. Me pregunto cuándo / si debería usarlos. ¿Vería los beneficios de rendimiento en una aplicación CRUD-heavy? ¿Hay inconvenientes a considerar, quizás relacionados con la seguridad?
Si es importante para ti, estoy usando MySQL 5.x.
En general, necesitará usar conexiones no persistentes algunas veces, y es bueno tener un patrón único para aplicar al diseño de conexión db (siempre que haya relativamente poco beneficio al usar conexiones persistentes en su contexto).
En mi humilde opinión:
Al usar PHP para el desarrollo web, la mayor parte de su conexión solo "vivirá" durante la vida de la página que se está ejecutando. Una conexión persistente le costará muchos gastos generales, ya que tendrá que ponerla en la sesión o algo por el estilo.
El 99% de las veces, una única conexión no persistente que muere al final de la ejecución de la página funcionará perfectamente.
El otro 1% de las veces, probablemente no deberías usar PHP para la aplicación, y no hay una solución perfecta para ti.
En resumen, mi experiencia dice que las conexiones persistentes deben evitarse tanto como sea posible.
Tenga en cuenta que mysql_close es un no-operation (no-op) para las conexiones que se crean usando mysql_pconnect. Esto significa que el cliente no puede cerrar la conexión persistente a voluntad. Dicha conexión será cerrada por el servidor mysqldb cuando no se produce actividad en la conexión por más tiempo que wait_timeout . Si wait_timeout es un valor grande (digamos 30 min), el servidor mysql db puede alcanzar fácilmente el límite de max_connections . En tal caso, mysql db no aceptará ninguna solicitud de conexión futura. Esto es cuando su buscapersonas comienza a sonar.
Para evitar alcanzar el límite de max_connections , el uso de la conexión persistente requiere un equilibrio cuidadoso de las siguientes variables ...
1. Number of apache processes on one host
2. Total number of hosts running apache
3. wait_timout variable in mysql db server
4. max_connections variable in mysql db server
5. Number of requests served by one apache process before it is re-spawned
Entonces, use una conexión persistente después de suficiente deliberación. Es posible que no desee invitar a problemas de tiempo de ejecución complejos por una pequeña ganancia que obtiene de la conexión persistente.
Iba a hacer la misma pregunta, pero en lugar de hacer la misma pregunta nuevamente, solo agregaré algo de información que encontré.
También vale la pena señalar que la nueva extensión mysqli ni siquiera incluye la opción de utilizar conexiones de bases de datos persistentes.
Todavía estoy usando conexiones persistentes en este momento pero planeo cambiar a no persistente en el futuro cercano.
OMI, la verdadera respuesta a esta pregunta es la que mejor funciona para su aplicación. Recomiendo que compares tu aplicación con conexiones persistentes y no persistentes.
Maggie Nelson @ objetivamente orientada publicó sobre esto en agosto y Robert Swarthout hizo una publicación de acompañamiento con algunos números duros. Ambas son buenas lecturas.
Puede usar esto como un "conjunto de reglas" aproximado:
SÍ , use conexiones persistentes, si:
- Solo hay unas pocas aplicaciones / usuarios accediendo a la base de datos, es decir, no tendrá 200 conexiones abiertas (pero probablemente inactivas), porque hay 200 usuarios diferentes compartidos en el mismo host.
- La base de datos se está ejecutando en otro servidor al que está accediendo a través de la red
- Una (una) aplicación accede a la base de datos con mucha frecuencia
NO , no use conexiones persistentes, si:
- Su aplicación solo necesita acceder a la base de datos 100 veces por hora.
- Tienes muchos servidores web accediendo a un servidor de base de datos
- Estás usando Apache en modo prefork. Utiliza una conexión para cada proceso secundario, que puede aumentar rápidamente. (a través de @Powerlord en los comentarios)
El uso de conexiones persistentes es considerablemente más rápido, especialmente si está accediendo a la base de datos a través de una red. No hace mucha diferencia si la base de datos se ejecuta en la misma máquina, pero aún es un poco más rápida. Sin embargo, como su nombre lo indica, la conexión es persistente, es decir, permanece abierta, incluso si no se utiliza.
El problema con eso es que, en "configuración predeterminada", MySQL solo permite 1000 "canales abiertos" paralelos. Después de eso, se rechazan las conexiones nuevas (puede modificar esta configuración). Entonces, si tiene, por ejemplo, 20 servidores web con cada 100 clientes en cada uno de ellos, y cada uno de ellos tiene solo un acceso a la página por hora, las matemáticas simples le mostrarán que necesitará 2000 conexiones paralelas a la base de datos. Eso no funcionará
Ergo: solo utilízalo para aplicaciones con muchas solicitudes.