Ejecutar sentencias

El complemento se puede usar con cualquier extensión de MySQL para PHP (mysqli, mysql, y PDO_MYSQL) que esté compilada para utilizar la biblioteca mysqlnd. PECL/mysqlnd_ms se acopla a la biblioteca mysqlnd. No cambia la API o el comportamiento de estas extensiones.

Siempre que se esté abriendo una conexión a MySQL, el complemento compara el valor del parámetro 'host' de la llamada de conexión con los nombres de las secciones del fichero de configuración específico del complemento. Si, por ejemplo, el fichero de configuración específico del complemento tiene una sección myapp , se ha de hacer referencia a ésta para abrir una conexión a MySQL para el anfitrión myapp

Ejemplo #1 Fichero de configuración específico del complemento (mysqlnd_ms_plugin.ini)

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "192.168.2.27",
                "port": "3306"
            }
        }
    }
}

Ejemplo #2 Abrir una conexión con equilibrado de carga

<?php
/* El equilibrado de carga sigue las reglas de la sección "myapp" del fichero de configuración del complemento */
$mysqli = new mysqli("myapp""nombre_usuario""contraseña""base_datos");
$pdo = new PDO('mysql:host=myapp;dbname=base_datos''nombre_usuario''contraseña');
$mysql mysql_connect("myapp""nombre_usuario""contraseña");
?>

Los ejemplos de conexión de arriba tendrán equilibrio de carga. El complemento enviará sentencias de sólo lectura al servidor esclavo de MySQL con la IP 192.168.2.27 y escuchará el puerto 3306 para la conexión cliente de MySQL. Todas las demás sentencias serán dirigidas al servidor maestro de MySQL que se ejecuta en el anfitrión localhost. Si se ejecuta en sistemas operativos de tipo Unix, el maestro sobre localhost aceptará conexiones cliente de MySQL en el socket de dominio Unix /tmp/mysql.sock, mientras que TCP/IP es el puerto predeterminado en Windows. El complemento usará el nombre de usuario nombre_usuario y la contraseña contraseña para conectarse a cualquier servidor de MySQL incluido en la sección myapp del fichero de configuración del complemento. Una vez realizada la conexión, el complemento seleccionará base_datos como el esquema actual.

El nombre de usuario, la contraseña y el nombre del esquema son tomados de las llamadas a la API de conexión y usados por todos los servidores. En otras palabras: se deben usar los mismos nombre de usuario y contraseña para cada servidor MySQL incluido en una sección del fichero de configuración del comlemento. No es una limitación generalizada. A partir de PECL/mysqlnd_ms 1.1.0, es posible establecer username y password para cualquier servidor del fichero de configuración del complemento, para utilizarlos en lugar de las credenciales pasadas a la llamada a la API.

El complemento no cambia la API para ejecutar sentencias. La división de lectura-escritura se desarrolla aparte. El siguiente ejemplo asume que no existe una demora de replicación significante entre el maestro y el esclavo.

Ejemplo #3 Ejecutar sentencias

<?php
/* El equilibrado de carga sigue las reglas de la sección "myapp" del fichero de configuración del complemento */
$mysqli = new mysqli("myapp""nombre_usuario""contraseña""base_datos");
if (
mysqli_connect_errno()) {
    
/* Por supuesto, su manejo de errores es mejor... */
    
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));
}

/* Las sentencias se ejcutarán en el maestro */
if (!$mysqli->query("DROP TABLE IF EXISTS test")) {
    
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
if (!
$mysqli->query("CREATE TABLE test(id INT)")) {
    
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
if (!
$mysqli->query("INSERT INTO test(id) VALUES (1)")) {
    
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}

/* solo lectura: la sentencia se ejecutará en un esclavo */
if (!($res $mysqli->query("SELECT id FROM test"))) {
    
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
} else {
    
$fila $res->fetch_assoc();
    
$res->close();
    
printf("El esclavó devuelve el ID = '%s'\n"$fila['id'];
}
$mysqli->close();
?>

El resultado del ejemplo sería algo similar a:

El esclavó devuelve el ID = '1'