©
本文档使用 PHP中文网手册 发布
这个插件可以配合 (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
$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 之间并没有很大的延迟。
Example #3 Executing statements
<?php
$mysqli = new mysqli ( "myapp" , "username" , "password" , "database" );
if ( mysqli_connect_errno ())
die( sprintf ( "[%d] %s\n" , mysqli_connect_errno (), mysqli_connect_error ()));
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 );
}
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'