Php/docs/mysqlnd-ms.quickstart.usage
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 通讯。
插件将使用 username
和 password
连接任何一个
在 myapp
章节中指定的数据库。在连接以后,将选择
database
设定的数据库作为当前操作数据库。
username, password 和默认数据库将在所有设定的数据库中做统一设定。 换句话说,就是所有的数据库必须使用同样的用户名口令登录。 从 1.1.0 版本以后,这个限制将不再存在,可以针对任何一个服务器通过 username 和 password 进行登录鉴权设定。
插件在不改变查询结构的基础上,提供 读写分离。 下面的范例假定 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'