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