这个插件可以配合 (mysqli, mysql, 和 PDO_MYSQL) 使用, 他们都是基于 mysqlnd library 工作的。 PECL/mysqlnd_ms 插件是 mysqlnd library 的一部分, 他并不改变这些扩展的 API 或者行为。
当 MySQL 链接打开的时候,插件会在配置文件中根据章节设定匹配 host 参数。
例如,插件配置文件中指定 myapp
,那么可以使用 myapp
作为 host 打开 MySQL 链接。
示例 #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" } } } }
示例 #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 通讯。
插件将使用 username
和 password
连接任何一个
在 myapp
章节中指定的数据库。在连接以后,将选择
database
设定的数据库作为当前操作数据库。
username, password 和默认数据库将在所有设定的数据库中做统一设定。 换句话说,就是所有的数据库必须使用同样的用户名口令登录。 从 1.1.0 版本以后,这个限制将不再存在,可以针对任何一个服务器通过 username 和 password 进行登录鉴权设定。
插件在不改变查询结构的基础上,提供 读写分离。 下面的范例假定 master 和 slave 之间并没有很大的延迟。
示例 #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'