Running statements

这个插件可以配合 (mysqli, mysql, 和 PDO_MYSQL) 使用, 他们都是基于 mysqlnd library 工作的。 PECL/mysqlnd_ms 插件是 mysqlnd library 的一部分, 他并不改变这些扩展的 API 或者行为。

当 MySQL 链接打开的时候,插件会在配置文件中根据章节设定匹配 host 参数。 例如,插件配置文件中指定 myapp,那么可以使用 myapp 作为 host 打开 MySQL 链接。

Example #1 插件指定的配置文件 (mysqlnd_ms_plugin.ini)

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

Example #2 开启一个负载均衡链接

<?php
/* 根据配置针对 myapp 开启一个负载均衡的链接 */
$mysqli = new mysqli("myapp""username""password""database");
$pdo = new PDO('mysql:host=myapp;dbname=database''username''password');
$mysql mysql_connect("myapp""username""password");
?>

上面的连接范例是负载均衡方式的。插件将发送只读查询给 192.168.2.27 端口 3306。其他的所有查询,将发送给 localhost 指定的 master 服务器。在 Linux 设备中, /tmp/mysql.sock 指定了本机的 MySQL 服务;在 Windows 系统中将使用默认的 TCP/IP 通讯。 插件将使用 usernamepassword 连接任何一个 在 myapp 章节中指定的数据库。在连接以后,将选择 database 设定的数据库作为当前操作数据库。

username, password 和默认数据库将在所有设定的数据库中做统一设定。 换句话说,就是所有的数据库必须使用同样的用户名口令登录。 从 1.1.0 版本以后,这个限制将不再存在,可以针对任何一个服务器通过 usernamepassword 进行登录鉴权设定。

插件在不改变查询结构的基础上,提供 读写分离。 下面的范例假定 master 和 slave 之间并没有很大的延迟。

Example #3 Executing statements

<?php
/* myapp 负载均衡设定 */
$mysqli = new mysqli("myapp""username""password""database");
if (
mysqli_connect_errno())
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 查询将在 master 上运行 */
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);
}

/* 只读查询将在 slave 上运行 */
if (!($res $mysqli->query("SELECT id FROM test")) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
} else {
 
$row $res->fetch_assoc();
 
$res->close();
 
printf("Slave returns id = '%s'\n"$row['id'];
}
$mysqli->close();
?>

以上例程的输出类似于:

Slave returns id = '1'