# La extensión mysqli y conexiones persistentes

EL soporte para conexiones persistentes fue introducido en PHP 5.3 para el extensión `mysqli`. El soporte ya estaba presente en PDO MYSQL y ext/mysql. La idea detrás de las conexiones persistentes es que una conexión entre un proceso cliente y una base de datos puede ser reutilizados por un proceso cliente, en lugar de ser creado y destruido varias veces. Esto reduce la sobrecarga de la creación de conexiones nuevas cada vez que es requerido, como las conexiones no utilizadas se almacenan en caché y están lista para ser reutilizadas.

A diferencia de la extensión mysql, mysqli no proporciona una función separada para la apertura de conexiones persistentes. Para abrir una conexión persistente debe de colocar `p:` al nombre del host cuando se conecta.

El problema con las conexiones persistentes es que se pueden dejar en estados impredecibles por los clientes. Por ejemplo, un bloqueo de tabla puede ser activado antes de que un cliente termina de forma inesperada. Un nuevo proceso cliente reusando esta conexión persistente tendrá la conexión tal cual. Toda la limpieza tendría que ser realizada por el nuevo proceso cliente antes de que pudiera hacer buen uso de la conexión persistente, aumentando la carga sobre el programador.

La conexión persistente de la extensión `mysqli` no obstante incorpora manejo para limpieza de código. La limpieza llevada a cabo por `mysqli` incluye:

- Rollback de transacciones activas

- Cierre y borrado de tablas temporales

- Desbloque de tablas

- Reestablece variables de sesión

- Cerrar consultas preparadas (siempre pasa con PHP)

- Cerrar controlador

- Quitar bloqueos adquiridos con GET_LOCK()

Esto asegura que las conexiones persistentes se encuentran en un estado limpio para el retorno del conjunto de conexiones, antes de que el proceso cliente los use.

La extensión `mysqli` hace la limpieza automáticamente llamando a la función `mysql_change_user()` de C-API.

La característica de limpieza automática tiene sus ventajas y desventajas aunque. La ventaja es que el programador no necesita preocuparse por estar añadiendo el código de limpieza, ya que es llamdo automáticamente. Asi mismo, la desventaja es que el código podría volverse potencialmente un poco más lento, pues el código para realizar la limpieza necesita ejecutarse cada vez que una conexión es devuelta por el conjunto de conexiones.

Es posible desactivar el código de limpieza automática, mediante la compilación de PHP si se define `MYSQLI_NO_CHANGE_USER_ON_PCONNECT`.

> Nota:

> La extensión `mysqli` soporta conexiones persistentes utilizando ya sea el driver nativo de MySQL o la libreria cliente de MySQL.