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 resultado del ejemplo sería:
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