## Conexiones

El servidor MySQL soporta el uso de diferentes capas de transporte para las conexiones. Las conexiones pueden utilizar TCP/IP, los sockets de dominio Unix o los tubos nombrados de Windows.

El nombre de host `localhost` tiene un significado especial. Está vinculado al uso de los sockets de dominio Unix. Para abrir una conexión TCP/IP en el host local, `127.0.0.1` debe ser utilizado en lugar de `localhost`.

Ejemplo #1 Significado especial de localhost

    <?php

    $mysqli = new mysqli("localhost", "user", "password", "database");

    echo $mysqli->host_info . "\n";

    $mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);

    echo $mysqli->host_info . "\n";

El ejemplo anterior mostrará:

    Localhost via UNIX socket
    127.0.0.1 via TCP/IP

Parámetros por omisión de una conexión

Dependiendo de la función de conexión utilizada, algunos parámetros pueden ser omitidos. Si un parámetro no es proporcionado, entonces la extensión intentará utilizar los valores por omisión definidos en el archivo de configuración de PHP.

Ejemplo #2 Parámetros por omisión

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

Estos valores de parámetros son entonces pasados a la biblioteca cliente utilizada por la extensión. Si la biblioteca cliente detecta un parámetro vacío o no definido, entonces utilizará los valores por omisión internos a la biblioteca.

Valores por omisión internos a la biblioteca para la conexión

Si el valor del host no está definido o es vacío, entonces la biblioteca cliente utilizará por omisión una conexión de tipo socket Unix en `localhost`. Si el socket no está definido o es vacío, y se solicita una conexión de tipo socket Unix, entonces se intentará una conexión al socket por omisión `/tmp/mysql.sock`.

En los sistemas Windows, el nombre de host `.` es interpretado por la biblioteca cliente como un intento de abrir un tubo nombrado de Windows para la conexión. En este caso, el parámetro socket es interpretado como un tubo nombrado. Si no es proporcionado o está vacío, entonces el socket (tubo nombrado) valdrá por omisión `\\.\pipe\MySQL`.

Si ni un socket de dominio Unix ni un tubo nombrado de Windows es proporcionado, se establecerá una conexión básica y si el valor del puerto no está definido, la biblioteca utilizará el puerto `3306`.

La biblioteca mysqlnd y la biblioteca cliente MySQL (libmysqlclient) implementan la misma lógica para determinar los valores por omisión.

Opciones de conexión

Las opciones de conexión están disponibles para, por ejemplo, definir comandos de inicialización a ejecutar durante la conexión, o para solicitar el uso de un juego de caracteres específico. Las opciones de conexión deben ser definidas antes de la conexión a la red.

Para definir una opción de conexión, la operación de conexión debe ser realizada en 3 pasos: creación de un manejador de conexión con mysqli_init() o mysqli::__construct(), definición de las opciones solicitadas utilizando mysqli::options(), y conexión a la red con mysqli::real_connect().

Cola de conexión

La extensión mysqli soporta las conexiones persistentes a la base de datos, que son conexiones especiales. Por omisión, cada conexión a una base de datos abierta por un script es cerrada explícitamente por el usuario durante la ejecución, o liberada automáticamente al final del script. Esto no es el caso de una conexión persistente. En efecto, será colocada en una cola para una reutilización futura, si una conexión al mismo servidor, utilizando el mismo nombre de usuario, la misma contraseña, el mismo socket, el mismo puerto, así como la misma base de datos es abierta. Esta reutilización permite aligerar la carga indebida por las conexiones.

Cada proceso PHP utiliza su propia cola de conexiones mysqli. Dependiendo del modelo de despliegue del servidor web, un proceso PHP puede servir una o varias peticiones. Sin embargo, una conexión en cola puede ser utilizada por uno o varios scripts posteriormente.

Las conexiones persistentes

Si una conexión persistente para una combinación de host, nombre de usuario, contraseña, socket, puerto y base de datos no utilizada no puede ser encontrada en la cola de conexión, entonces mysqli abrirá una nueva conexión. El uso de las conexiones persistentes puede ser activado o desactivado utilizando la directiva PHP mysqli.allow_persistent. El número total de conexiones abiertas por un script puede ser limitado con la directiva mysqli.max_links. El número máximo de conexiones persistentes por proceso PHP puede ser restringido con la directiva mysqli.max_persistent. Tenga en cuenta que el servidor web puede generar varios procesos PHP.

Una queja común contra las conexiones persistentes es que su estado no es re-initializado antes de la reutilización. Por ejemplo, las transacciones abiertas y no terminadas no son automáticamente anuladas. Además, las modificaciones autorizadas que ocurren entre el momento en que la conexión es colocada en cola y su reutilización no serán tomadas en cuenta. Este comportamiento puede ser visto como un efecto de borde no deseado. Por el contrario, el nombre `persistent` puede ser comprendido como una promesa sobre el hecho de que el estado persiste realmente.

La extensión mysqli soporta dos interpretaciones de una conexión persistente : estado persistente, y un estado re-initializado antes de la reutilización. Por omisión, será re-initializado. Antes de que una conexión persistente sea reutilizada, la extensión mysqli llama implícitamente a la función mysqli::change_user() para re-initializar el estado. La conexión persistente aparece al usuario como si acabara de ser abierta. Ninguna traza de un uso anterior será visible.

La función mysqli::change_user() es una operación costosa. Para mejores rendimientos, los usuarios pueden querer re-compilar la extensión con el flag de compilación `MYSQLI_NO_CHANGE_USER_ON_PCONNECT`.

Así, se dejará al usuario la elección entre un comportamiento seguro y un rendimiento optimizado. Ambos tienen como objetivo la optimización. Para una utilización más sencilla, el comportamiento seguro ha sido colocado por omisión en detrimento de un rendimiento máximo.

Ver también

- mysqli_init()
- mysqli::__construct()
- mysqli::options()
- mysqli::real_connect()
- mysqli::change_user()
- $mysqli::host_info
- Las opciones de configuración MySQLi
- Las conexiones persistentes a las bases de datos

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open