que ejemplo create conexion conectar con cerrar php pdo

ejemplo - php pdo connection mysql



¿Cuáles son las desventajas de usar una conexión persistente en PDO? (8)

Asegúrese de leer esta respuesta a continuación , que detalla las formas de mitigar los problemas descritos aquí.

Existen los mismos inconvenientes al utilizar PDO que con cualquier otra interfaz de base de datos PHP que mantenga conexiones persistentes: si el script termina inesperadamente en medio de las operaciones de la base de datos, la siguiente solicitud que obtiene la conexión restante continuará donde dejó el script muerto. La conexión se mantiene abierta en el nivel del administrador de procesos (Apache para mod_php, el proceso FastCGI actual si está utilizando FastCGI, etc.), no en el nivel de PHP, y PHP no le dice al proceso principal que la conexión muera cuando la secuencia de comandos termina anormalmente

Si el script muerto bloquea las tablas, esas tablas permanecerán bloqueadas hasta que la conexión fallezca o el siguiente script que obtenga la conexión desbloquee las tablas.

Si el script muerto estaba en el medio de una transacción, eso puede bloquear una multitud de tablas hasta que comience el temporizador de interbloqueo, e incluso entonces, el temporizador de interbloqueo puede matar la solicitud más nueva en lugar de la solicitud anterior que está causando el problema.

Si el script muerto estaba en el medio de una transacción, el siguiente script que obtiene esa conexión también obtiene el estado de la transacción. Es muy posible (dependiendo del diseño de su aplicación) que el siguiente script no intente nunca comprometer la transacción existente, o se comprometa cuando no debería, o retroceda cuando no debería.

Esto es solo la punta del iceberg. Todo se puede mitigar en cierta medida siempre tratando de limpiar después de una conexión sucia en cada solicitud de script, pero eso puede ser un problema dependiendo de la base de datos. A menos que haya identificado la creación de conexiones de bases de datos como lo único que es un cuello de botella en su secuencia de comandos (esto significa que ha realizado perfiles de código usando xdebug y / o xhprof ), no debe considerar las conexiones persistentes como una solución para nada.

Además, la mayoría de las bases de datos modernas (incluido PostgreSQL) tienen sus propias formas preferidas de realizar la agrupación de conexiones que no tienen los inconvenientes inmediatos que tienen las simples conexiones persistentes basadas en PHP.

Para aclarar un punto, usamos conexiones persistentes en mi lugar de trabajo, pero no por elección. Nos topamos con un extraño comportamiento de conexión, donde la conexión inicial de nuestro servidor de aplicaciones a nuestro servidor de base de datos tardaba exactamente tres segundos, cuando debería haber tomado una fracción de una fracción de segundo. Creemos que es un error del kernel. Nos dimos por vencidos tratando de solucionarlo porque sucedió de forma aleatoria y no podía reproducirse a pedido, y nuestra TI subcontratada no tenía la capacidad concreta de rastrearlo.

A pesar de eso, cuando la gente en el almacén está procesando unos cientos de partes entrantes, y cada parte está tardando tres segundos y medio en lugar de medio segundo, tuvimos que tomar medidas antes de que nos secuestraran a todos y nos hicieran ayudarlos. Entonces, dimos un vistazo a nuestra monstruosidad local ERP / CRM / CMS y experimentamos todos los horrores de las conexiones persistentes de primera mano. Nos llevó semanas encontrar todos los pequeños problemas sutiles y el comportamiento extraño que sucedió aparentemente al azar. Resultó que esos errores fatales de una vez a la semana que nuestros usuarios extraían diligentemente de nuestra aplicación dejaban mesas bloqueadas, transacciones abandonadas y otros estados poco afortunados.

Esta historia triste tiene un punto: rompió cosas que nunca esperábamos romper, todo en nombre del rendimiento. El intercambio no valió la pena, y estamos esperando ansiosamente el día en que podamos volver a las conexiones normales sin un disturbio de nuestros usuarios.

En PDO, una conexión puede hacerse persistente utilizando el atributo PDO::ATTR_PERSISTENT . De acuerdo con el manual php -

Las conexiones persistentes no se cierran al final del script, sino que se almacenan en caché y se vuelven a usar cuando otro script solicita una conexión con las mismas credenciales. La caché de conexión persistente le permite evitar la sobrecarga de establecer una nueva conexión cada vez que una secuencia de comandos necesita hablar con una base de datos, lo que resulta en una aplicación web más rápida.

El manual también recomienda no utilizar una conexión persistente mientras se utiliza el controlador PDO ODBC, ya que puede obstaculizar el proceso de agrupación de conexiones ODBC.

Entonces, aparentemente, no parece haber inconvenientes de usar una conexión persistente en PDO, excepto en el último caso. Sin embargo, me gustaría saber si hay otras desventajas de usar este mecanismo, es decir, una situación en la que este mecanismo dé como resultado una degradación del rendimiento o algo así.


En mis pruebas tuve un tiempo de conexión de más de un segundo con mi servidor local, suponiendo que debería usar una conexión persistente. Pruebas adicionales mostraron que era un problema con ''localhost'':

Resultados de la prueba en segundos (medidos por php microtime):

  • web alojada: connectDB: 0.0038912296295166
  • localhost: connectDB: 1.0214691162109 (más de un segundo: ¡no use localhost!)
  • 127.0.0.1: connectDB: 0.00097203254699707

Curiosamente, el siguiente código es tan rápido como usar 127.0.0.1:

$host = gethostbyname(''localhost''); // echo "<p>$host</p>"; $db = new PDO("mysql:host=$host;dbname=" . DATABASE . '';charset=utf8'', $username, $password, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));


En respuesta al problema de Charles anterior,

Desde: http://www.php.net/manual/en/mysqli.quickstart.connections.php -

Una queja común sobre las conexiones persistentes es que su estado no se restablece antes de la reutilización. Por ejemplo, las transacciones abiertas y sin terminar no se retrotraen automáticamente. Pero también, los cambios de autorización que ocurrieron en el tiempo transcurrido entre la conexión al grupo y su reutilización no se reflejan. Esto puede verse como un efecto secundario no deseado. Por el contrario, el nombre persistente se puede entender como una promesa de que el estado persiste.

La extensión mysqli admite ambas interpretaciones de una conexión persistente: estado persistido y restablecimiento de estado antes de la reutilización. El valor predeterminado es restablecer. Antes de reutilizar una conexión persistente, la extensión mysqli llama implícitamente a mysqli_change_user() para restablecer el estado. La conexión persistente aparece para el usuario como si acabara de abrirse. No hay artefactos de usos anteriores visibles.

La función mysqli_change_user() es una operación costosa. Para obtener el mejor rendimiento, los usuarios pueden querer recompilar la extensión con el indicador de compilación MYSQLI_NO_CHANGE_USER_ON_PCONNECT establecido.

Le corresponde al usuario elegir entre un comportamiento seguro y el mejor rendimiento. Ambos son objetivos de optimización válidos. Para facilitar el uso, el comportamiento seguro se ha convertido en el predeterminado a expensas del máximo rendimiento.


La explicación para usar conexiones persistentes obviamente reduce la cantidad de conexiones que son bastante costosas, a pesar de que son considerablemente más rápidas con MySQL en comparación con otras bases de datos.

El primer problema con las conexiones persistentes ...

Si está creando miles de conexiones por segundo, normalmente no se asegura de que permanezca abierto durante mucho tiempo, pero el sistema de operación lo hace. Basado en el protocolo TCP / IP Los puertos no se pueden reciclar instantáneamente y también tienen que invertir un tiempo en la etapa "FIN" antes de poder reciclarse.

El segundo problema ... usando muchas conexiones de servidor MySQL.

Mucha gente simplemente no se da cuenta de que puede aumentar la variable * max_connections * y obtener más de 100 conexiones simultáneas con MySQL, mientras que otros fueron vencidos por problemas anteriores de Linux por la imposibilidad de transmitir más de 1024 conexiones con MySQL.

Permite hablar ahora sobre por qué las conexiones persistentes se inhabilitaron en la extensión mysqli. A pesar del hecho de que puede hacer un mal uso de las conexiones persistentes y obtener un rendimiento deficiente que no fue la razón principal. La verdadera razón es que puede tener muchos más problemas con ella.

Las conexiones persistentes se pusieron en PHP en todas las ocasiones de MySQL 3.22 / 3.23 cuando MySQL no era tan difícil, lo que significa que podía reciclar conexiones fácilmente sin problemas. En versiones posteriores, sin embargo, se produjo una gran cantidad de problemas: si recicla una conexión que tiene transacciones no comprometidas, tendrá problemas. Si reciclas las conexiones con configuraciones de juego de caracteres personalizadas, estás en peligro nuevamente, así como posiblemente sobre las variables transformadas por sesión.

Un problema con el uso de conexiones persistentes es que realmente no se escala tan bien. Para aquellos que tienen 5000 personas conectadas, necesitarás 5000 conexiones persistentes. Para alejarse del requisito de persistencia, puede tener la capacidad de atender a 10000 personas con una cantidad similar de conexiones porque están en condiciones de compartir conexiones individuales cuando no están con ellos.


Las conexiones persistentes deberían dar un impulso de rendimiento considerable. No estoy de acuerdo con el comentario de que debes "evitar" la persistencia ...

Parece que las quejas anteriores son impulsadas por alguien que usa las tablas de MyIASM y hackeando sus propias versiones de transacciones agarrando cerraduras de la mesa ... ¡Por supuesto que se va a estancar! Utilice PDO''s beginTransaction () y mueva sus tablas a InnoDB ..


Las conexiones persistentes son una buena idea solo cuando toma un tiempo (relativamente) largo para conectarse a su base de datos. Hoy en día eso casi nunca es el caso. El mayor inconveniente para las conexiones persistentes es que limita el número de usuarios que puede tener al navegar su sitio: si MySQL está configurado para permitir solo 10 conexiones concurrentes a la vez, cuando una persona número 11 intente navegar su sitio, no funcionará para ellos .

PDO no administra la persistencia. El controlador MySQL sí. Reutiliza las conexiones cuando a) están disponibles y el servidor / usuario / contraseña / base de datos coinciden. Si hay algún cambio, no reutilizará una conexión. El mejor efecto neto del caso es que estas conexiones que tiene se iniciarán y se detendrán con tanta frecuencia porque tiene diferentes usuarios en el sitio y hacerlos persistentes no sirve de nada.

La clave para entender acerca de las conexiones persistentes es que NO debes utilizarlas en la mayoría de las aplicaciones web. Suenan tentadores, pero son peligrosos y bastante inútiles.

Estoy seguro de que hay otros hilos en esto, pero una conexión persistente es peligrosa porque persiste entre las solicitudes. Si, por ejemplo, bloquea una tabla durante una solicitud y luego no lo desbloquea, esa mesa permanecerá bloqueada indefinidamente. Las conexiones persistentes también son bastante inútiles para el 99% de sus aplicaciones porque no tiene forma de saber si se usará la misma conexión entre diferentes solicitudes. Cada hilo web tendrá su propio conjunto de conexiones persistentes y no tendrá forma de controlar qué hilo manejará qué solicitudes.

La biblioteca de mysql de procedimientos de PHP tiene una función mediante la cual las llamadas subsiguientes a mysql_connect devolverán el mismo enlace, en lugar de abrir una conexión diferente (como cabría esperar). Esto no tiene nada que ver con las conexiones persistentes y es específico de la biblioteca mysql. PDO no exhibe tal comportamiento

Enlace de recursos: link

En general, podrías usar esto como un "conjunto de reglas" en bruto:

, 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.

  • Tiene muchos, muchos servidores web accediendo a un servidor de base de datos

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 ajustar 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.


Me preguntaba si una solución parcial sería tener un conjunto de conexiones de uso único. Podría perder tiempo creando un grupo de conexiones cuando el sistema tiene un uso bajo, hasta un límite, entréguelas y elimínelas cuando hayan finalizado o se haya agotado el tiempo de espera. En el fondo, estás creando nuevas conexiones a medida que se toman. En el peor de los casos, esto solo debería ser tan lento como crear la conexión sin el conjunto, suponiendo que establecer el enlace es el factor limitante.


me parece que tener una conexión persistente consumiría más recursos del sistema. Tal vez una cantidad trivial, pero aún así ...