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.