## Conexiones

El servidor MySQL soporta el uso de diferentes capas de transporte para conexiones. Las conexiones usan TCP/IP, sockets de dominio Unix o tuberías con nombre de Windows.

El nombre del host `localhost` tiene un significado especial. Está vinculado al uso de sockets de dominio Unix. No es posible abrir una conexión TCP/IP usando como nombre de host `localhost`, se debe usar `127.0.0.1` en su lugar.

Ejemplo #1 Significado especial de localhost

`<?php
$mysqli = new mysqli("localhost", "usuario", "contraseña", "basedatos");
if ($mysqli->connect_errno) {
echo "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "usuario", "contraseña", "basedatos", 3306);
if ($mysqli->connect_errno) {
echo "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "\n";
?>`

El resultado del ejemplo sería:

    Localhost via UNIX socket
    127.0.0.1 via TCP/IP

Valores predeterminados de los parámetros de conexión

Dependiendo de la función de conexión usada se pueden omitir varios parámetros. Si no se proporciona un parámetro, la extensión intentará usar los valores predeterminados que están establecidos en el fichero de configuración de PHP.

Ejemplo #2 Configuración predeterminada

    mysqli.default_host=192.168.2.27
    mysqli.default_user=root
    mysqli.default_pw=""
    mysqli.default_port=3306
    mysqli.default_socket=/tmp/mysql.sock

Los valores resultantes de los parámetros son pasados a la biblioteca cliente que esté usando esta extensión. Si la biblioteca cliente detecta parámetros vacíos o no establecidos, puede usar los valores internos predeterminados de la biblioteca.

Valores predeterminados internos de conexión de la biblioteca

Si el valor del host no está establecido o está vacío, la biblioteca cliente usará una conexión de socket Unix sobre `localhost`. Si el socket no está establecido o está vacío, y es solicitada una conexión de socket Unix, se intentará una conexiónal socket predeterminado de `/tmp/mysql.sock`.

En sistemas Windows, el nombre de host `.` es interpretado por la biblioteca cliente como un intento de abrir una conexión basada en una tubería con nombre de Windows. En este caso el parámetro del socket se interpreta como el nombre de la tubería. Si no se proporciona o está vacío, se usará como socket (nombre de la tubería) `\\.\pipe\MySQL`.

Si no está establecida una conexión basada en un socket de dominio Unix ni en una tubería con nombre de Windows y el valor del parámetro del puerto no está establecido, la biblioteca usuará como puerto predeterminado el `3306`.

La biblioteca mysqlnd y la Biblioteca Cliente de MySQL (libmysqlclient) implementan la misma lógica para determinados valores predeterminados.

Opciones de conexión

Las opciones de conexión están disponibles para, por ejemplo, establecer comando iniciales que son ejecutados sobre la conexión, o para solicitar el uso de ciertos conjuntos de caracteres. Las opciones de conexión deben ser establecidas antes de que se establezcla una conexión de red.

Para configurar una opción de conexión, la operación de conexión ha de ser realizada en tres pasos: crear un gestor de conexión con mysqli_init(), establecer las opciones solicitadas usando mysqli_options(), y establecer la conexión de red con mysqli_real_connect().

Caché de conexiones

La extensión mysqli soporta conexiones persistentes a bases de datos, las cuales son un tipo especial de conexiones almacenadas en caché. Por defecto, cada conexión a una base de datos abierta por un script es cerrada explícitamente por el usuario durante el tiempo de ejecución o liberada automáticamente al finalizar el script. Una conexión persistente no. En su lugar, se coloca en una caché para su reutilización posterior, si una conexión es abierta al mismo servidor usando el mismo nombre de usuario, contraseña, socket, puerto y base de datos predeterminada. La reutilización ahorra gastos de conexioń.

Cada procesos de PHP utiliza su propia caché de conexiones mysqli. Dependiendo de modelo de distribución del servidor web, un proceso PHP puede servir una o múltiples peticiones. Por lo tanto, una conexión almacenada en caché puede ser utilizada posteriormente por uno o más scripts.

Conexiones persistentes

Si una conexión persistente no usada con una combiación dada de host, nombre de usuario, contraseña, socket, puerto y base de datos predeterminada no se puede encontrar en la caché de conexiones, mysqli abrirá una nueva conexión. El uso de conexiones persistentes se puede habilitar y deshabilitar usando la directiva de PHP mysqli.allow_persistent. El número total de conexiones abiertas por un script puede ser limitado con mysqli.max_links. El número máximo de conexiones persistentes por proceso de PHP puede restringirse con mysqli.max_persistent. Observe que el servidor web puede engendrar muchos procesos de PHP.

Una queja común sobre las conexiones persistentes qes que su estado no es reiniciado antes de su uso. Por ejemplo, las transacciones abiertas y no finalizadas no son automéáticamente reanudadas. También, los cambios de autorización que ocurran durante la colocación de la conexión en la caché y su reutilización no están reflejados. Esto puede verse como un efecto secundario no deseado. Al contrario, el nombre `persistente` puede entenderse como una promesa de que el estado persiste.

La extensión mysqli soporta ambas interpretaciones de una conexión persistente: el estado persiste, y el estado se reinicia antes de la reutilización. Lo predeterminado es la reiniciación. Antes de que una conexión sea reutilizada, la extensión llama implicitamente a mysqli_change_user() para reiniciar el estado. La conexión persistente aparece al usuario como si estuviera recién abierta. No son visibles ningún artefacto de los usos previos.

La función mysqli_change_user() es una operación cara. Para un mejor rendimiento, los usuarios pueden recompilar la extensión con la bandera de compilación `MYSQLI_NO_CHANGE_USER_ON_PCONNECT` establecida.

Corresponde al usuario elegir entre comportamiento seguro o mejor rendimiento. Ambas son metas de optimización válidas. Para facilitar el uso, el comportamiento seguro es el predeterminado a expensas de un rendimiento máximo.

See also

- mysqli::__construct()
- mysqli::init()
- mysqli::options()
- mysqli::real_connect()
- mysqli::change_user()
- $mysqli::host_info
- Opciones de configuración de MySQLi
- Conexiones persistentes a bases de datos