Pregunta

Tengo esta duda, he buscado en la web y las respuestas parecen estar diversificadas. ¿Es mejor usar mysql_pconnect sobre mysql_connect cuando se conecta a una base de datos a través de PHP? Leí que pconnect se escala mucho mejor, pero, por otro lado, al ser una conexión persistente ... tener 10 000 conexiones al mismo tiempo, todas persistentes, no me parecen escalables.

Gracias de antemano.

¿Fue útil?

Solución

Las conexiones persistentes no deberían ser necesarias para MySQL. En otras bases de datos (como Oracle), hacer una conexión es costoso y requiere mucho tiempo, por lo que si puede reutilizar una conexión, es una gran victoria. Pero esas marcas de bases de datos ofrecen agrupación de conexiones, lo que resuelve el problema de una mejor manera.

Hacer una conexión a una base de datos MySQL es rápido en comparación con esas otras marcas, por lo que usar conexiones persistentes proporciona proporcionalmente menos beneficios para MySQL que para otra marca de base de datos.

Las conexiones persistentes también tienen un inconveniente. El servidor de bases de datos asigna recursos a cada conexión, ya sea que las conexiones sean necesarias o no. Entonces verá muchos recursos desperdiciados sin ningún propósito si las conexiones están inactivas. No sé si llegará a 10.000 conexiones inactivas, pero incluso un par de cientos son costosas.

Las conexiones tienen estado, y sería inapropiado que una solicitud de PHP herede " información de una sesión utilizada previamente por otra solicitud PHP. Por ejemplo, las tablas temporales y las variables de usuario normalmente se limpian cuando se cierra una conexión, pero no si usa conexiones persistentes. Del mismo modo, las configuraciones basadas en sesión como el conjunto de caracteres y la intercalación. Además, LAST_INSERT_ID () informaría la última identificación generada durante la sesión, incluso si fue durante una solicitud PHP anterior.

Al menos para MySQL, la desventaja de las conexiones persistentes probablemente supera sus beneficios. Y hay otras técnicas mejores para lograr una alta escalabilidad.


Actualización de marzo de 2014:

La velocidad de conexión de MySQL siempre fue baja en comparación con otras marcas de RDBMS, pero está mejorando aún más.

Ver http://mysqlserverteam.com/improving-connectdisconnect-performance/

  

En MySQL 5.6 comenzamos a trabajar en la optimización de las conexiones y desconexiones de manejo de código. Y este trabajo se ha acelerado en MySQL 5.7. En esta publicación de blog, primero mostraré los resultados que hemos logrado y luego describiré lo que hemos hecho para obtenerlos.

Lea el blog para más detalles y comparaciones de velocidad.

Otros consejos

Básicamente, debe equilibrar el costo de crear conexiones versus mantener conexiones. Aunque MySQL es muy rápido para configurar una nueva conexión, todavía cuesta: en el tiempo de configuración de subprocesos y en el tiempo de configuración de TCP / IP desde su servidor web. Esto se nota en un sitio de tráfico lo suficientemente alto. Desafortunadamente, PHP no tiene ningún control sobre la persistencia de las conexiones. Entonces, la respuesta es reducir el tiempo de espera inactivo en MySQL por un largo camino (hasta 20 segundos) y aumentar el tamaño de la caché de subprocesos. Juntos, esto generalmente funciona notablemente bien.

Por otro lado, su aplicación debe respetar el estado de la conexión. Es mejor si no hace suposiciones sobre en qué estado se encuentra la sesión. Si usa tablas temporales, usar CREATE IF NOT EXISTS y TRUNCATE TABLE ayuda mucho, al igual que nombrarlas de forma exclusiva (como incluir como userid). Las transacciones son un poco más problemáticas; pero su código siempre puede hacer ROLLBACK en la parte superior, por si acaso.

Es muy poco probable que llegues a 10000 conexiones. De todos modos, vaya a la fuente oficial . (El énfasis es mío).

  

Si las conexiones persistentes no tienen   Cualquier funcionalidad añadida, cuales son   son buenos para

     

La respuesta aquí es extremadamente simple:   eficiencia. Conexiones persistentes son   bueno si la sobrecarga para crear un enlace   a su servidor SQL es alto. Si o   no esta sobrecarga es realmente alta   Depende de muchos factores. Como que   tipo de base de datos, sea o no   no se sienta en la misma computadora en   cuál es su servidor web, cómo   cargado la máquina se sienta el servidor SQL   en es y así sucesivamente. El resultado final   es que si esa sobrecarga de conexión es   las conexiones altas y persistentes te ayudan   considerablemente . Hacen que el niño   proceso para simplemente conectar una sola vez   durante toda su vida útil, en lugar de   cada vez que procesa una página que   requiere conectarse al servidor SQL.   Esto significa que por cada niño que   abrió una conexión persistente   tiene su propia persistencia abierta   conexión al servidor. Por ejemplo,   si tuvieras 20 hijos diferentes   procesos que ejecutaron un script que hizo   una conexión persistente a tu SQL   servidor, tendrías 20 diferentes   conexiones al servidor SQL, uno   de cada niño.

     

Tenga en cuenta, sin embargo, que esto puede tener algunos   inconvenientes si está utilizando una base de datos   con límites de conexión que son   superado por niño persistente   conexiones Si su base de datos tiene una   límite de 16 conexiones simultáneas,   y en el curso de un servidor ocupado   sesión, 17 hilos secundarios intentan   Conectar, uno no podrá. Si   hay errores en tus scripts que   no permita que se cierren las conexiones   abajo (como bucles infinitos), el   Base de datos con solo 16 conexiones puede   ser rápidamente inundado. Revisar su   documentación de la base de datos para información   sobre el manejo abandonado o inactivo   conexiones.

mysql_connect () y mysql_pconnect () ambos funcionan para la conexión de la base de datos pero con poca diferencia. En mysql_pconnect () , p significa conexión persistente.

Cuando usamos la función mysql_connect () , cada vez que abre y cierra la conexión de la base de datos, según la solicitud.

Pero en el caso de la función mysql_pconnect () :

  • Primero, al conectarse, la función intentaría encontrar una conexión (persistente) que ya esté abierta con el mismo host, nombre de usuario y contraseña. Si se encuentra uno, se devolverá un identificador para el mismo en lugar de abrir una nueva conexión.

  • Segundo, la conexión con el servidor SQL no se cerrará cuando finalice la ejecución del script. En su lugar, la conexión permanecerá abierta para uso futuro ( mysql_close () no cerrará la conexión establecida por mysql_pconnect() ).

mysql_pconncet () es útil cuando tienes muchos trámites en tu sitio. En ese momento, para cada solicitud no abrirá una conexión, sino que la tomará del grupo. Esto aumentará la eficiencia de su sitio. Pero para uso general, mysql_connect () es el mejor.

MYSQL_CONNECT()

1.mysql_connect se puede usar para cerrar la conexión. Cada vez que abre y cierra la conexión de la base de datos, según la solicitud.

2.Aquí la base de datos se abre cada vez que la página se carga en MYSQL connect

3.Cuando se carga la página, la base de datos se carga cada vez

4.Se utiliza para cerrar la conexión

Ejemplo:

<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?>

Descripción:

host: especifica un nombre de host o una dirección IP como localhost.

mysql_user: especifica el nombre de usuario de MySQL

mysql_password: especifica la contraseña de MySQL

MYSQL_PCONNECT()

1.Utilizamos mysql_pconncet (), inicialmente intenta encontrar una conexión abierta y persistente.

2.The mysql_pconncet () abre una conexión persistente

3.El mysql_pconnect () no admite la conexión cercana

4.mysql_pconnect () no puede cerrar la conexión. Aquí abra una conexión persistente a la base de datos

5.La base de datos no necesita estar conectada cada vez.

6. La base de datos no necesita estar conectada cada vez en mysql_pconncet ().

más detalles: http://prittytimes.com/difference-between-mysql_connect- and-mysql_pconnect /

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