Pregunta

Estoy usando la capa PDO de PHP para acceder a datos en un proyecto, he estado leyendo sobre ella y he visto que tiene un buen soporte innato para conexiones de base de datos persistentes.Me pregunto cuándo/si debería usarlos.¿Veré beneficios de rendimiento en una aplicación con mucho CRUD?¿Hay desventajas a considerar, quizás relacionadas con la seguridad?

Si te importa, estoy usando MySQL 5.x.

¿Fue útil?

Solución

Podrías usar esto como un "conjunto de reglas" aproximado:

, utilice conexiones persistentes, si:

  • Sólo hay unas pocas aplicaciones/usuarios que acceden a la base de datos, es decir.no resultará en 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 accede a través de la red.
  • Una (una) aplicación accede a la base de datos con mucha frecuencia

NO, no utilice conexiones persistentes, si:

  • Su aplicación sólo necesita acceder a la base de datos 100 veces por hora.
  • Tiene 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 hijo, lo que puede acelerarse con bastante rapidez.(a través de @Powerlord en los comentarios)

El uso de conexiones persistentes es considerablemente más rápido, especialmente si accede a la base de datos a través de una red.No hay mucha diferencia si la base de datos se ejecuta en la misma máquina, pero aun así es un poco más rápido.Sin embargo, como su nombre indica, la conexión es persistente, es decir.permanece abierto, incluso si no se utiliza.

El problema con esto es que en la "configuración predeterminada", MySQL sólo permite 1000 "canales abiertos" paralelos.Después de eso, se rechazan las nuevas conexiones (puede modificar esta configuración).Entonces, si tiene, digamos, 20 servidores web con 100 clientes cada uno, y cada uno de ellos tiene solo un acceso a una página por hora, las matemáticas simples le mostrarán que necesitará 2000 conexiones paralelas a la base de datos.Eso no funcionará.

Es decir:Úselo solo para aplicaciones con muchas solicitudes.

Otros consejos

En resumen, mi experiencia dice que se deben evitar en la medida de lo posible las conexiones persistentes.

Tenga en cuenta que mysql_close es una no operación (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.El servidor mysqldb cerrará dicha conexión cuando no se produzca actividad en la conexión durante más de tiempo de espera.Si tiempo de espera es un valor grande (digamos 30 minutos), entonces el servidor de base de datos mysql puede alcanzar fácilmente conexiones_max límite.En tal caso, mysql db no aceptará ninguna solicitud de conexión futura. Aquí es cuando su busca comienza a sonar.

Para evitar llegar conexiones_max límite, el uso de una conexión persistente necesita un equilibrio cuidadoso de las siguientes variables...

  1. Número de procesos de Apache en un host
  2. Número total de hosts que ejecutan Apache
  3. variable wait_timout en el servidor de base de datos mysql
  4. variable max_connections en el servidor de base de datos mysql
  5. Número de solicitudes atendidas por un proceso de Apache antes de que vuelva a generarse

Por lo tanto, utilice una conexión persistente después de suficiente deliberación.Es posible que no desee provocar problemas complejos de tiempo de ejecución por una pequeña ganancia que obtiene de una conexión persistente.

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 el "agrupación de conexiones", que es más o menos lo mismo y también es una buena idea.

En mi opinión, la verdadera respuesta a esta pregunta es lo que funcione mejor para su aplicación.Te recomendaría que compares tu aplicación utilizando conexiones persistentes y no persistentes.

Maggie Nelson@ Orientado objetivamente publicado sobre esto en agosto y Robert Swarthout Hizo una publicación adjunta con algunos números concretos.Ambas son lecturas bastante buenas.

En mi humilde opinión:

Cuando utilice PHP para el desarrollo web, la mayor parte de su conexión sólo "vivirá" mientras la página se ejecute.Una conexión persistente le costará muchos gastos generales, ya que tendrá que incluirla en la sesión o algo así.

El 99% de las veces, una única conexión no persistente que muere al final de la ejecución de la página funcionará bien.

El otro 1% de las veces, probablemente no deberías usar PHP para la aplicación y no existe una solución perfecta para ti.

Iba a hacer la misma pregunta, pero en lugar de volver a hacer la misma pregunta, simplemente agregaré información que encontré.

También vale la pena señalar que la extensión mysqli más nueva ni siquiera incluye la opción de usar conexiones de bases de datos persistentes.

Sigo usando conexiones persistentes en este momento, pero planeo cambiar a no persistentes en un futuro próximo.

En general, a veces necesitarás usar conexiones no persistentes, y es bueno tener un patrón único para aplicar al diseño de la conexión de base de datos (siempre que haya relativamente pocas ventajas de usar conexiones persistentes en tu contexto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top