PHP mysqlnd插件mysqlnd_ms教程及详细介绍

Posted by 陶之11@System,Program,Share

一、首先,mysqlnd是啥个玩意? 为什么要使用mysqlnd?

原因一: license问题
libmysql是MYSQL AB公司开发的,现在已经是Oracle集团所属的了,它使用MYSQL license发布。
This ultimately led to MySQL support being disabled by default in PHP
mysqlnd 是php的一部分,使用PHP license发布。
从此 licensing 的问题就算是解决了。

原因二:编译问题
使用libmysql的时候,如果要正常编译php,必须首先安装好mysql。
如果是单纯的一台WEB服务器,装个mysql似乎有点浪费了。
mysqlnd的话,就不必安装mysql,直接可用。

原因三:性能问题
由于mysqlnd是一个php扩展,使用了php memory management system,在内存使用方面效率相当高。
举个例子:
使用libmysql的时候,mysql结果集中的每一行都在内存中储存了二次 !
使用mysqlnd,结果集只会储存一次。
而且它还服从于php.ini中memory_limit的设置。
Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。

mysqlnd的新特性
1 改进的persistent connection。
2 特殊函数 mysqli_fetch_all()
http://cn2.php.net/manual/en/mysqli-result.fetch-all.php
只有安装了mysqlnd, mysqli中的这个函数才可用。
3 Performance statistics calls: mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()
在分析性能瓶颈的时候,这些函数还是蛮好用的。
详细文档可以看这里: http://cn2.php.net/manual/en/mysqlnd.stats.php
4 使用mysqlnd之后,mysqli也支持persistent connection了。
这样看起来,mysqli受益最多。
5 PHP 5.3.3 之后,mysqlnd支持SSL。
6 PHP 5.3.2 之后,mysqlnd支持Compressed Protocol
7 PHP 5.3.4 之后,windows系统中的mysqlnd支持Named Pipes。

二、关于mysqlnd插件

这个扩展, 主要实现了, 连接保持和切换, 负载均衡和读写分离等, 也就是说, 这个扩展会去分别PHP发给MySQL的query, 如果是”读”的query, 就会把query发送给从库(配置中指明), 并且支持负载均衡; 而如果是”写”的query, 就会把query发送给主库.

不过这个扩展需要搭配mysqlnd一起使用(从PHP5.4 beta1开始, 我们已经把mysqlnd作为mysql, mysqli, pdo的默认链接目标, 当然, 你也可以通过–with-mysql=***来制定你想要链接到libmysql).

这个扩展使用的方法也很简单, 首先在php.ini中定义配置:

mysqlnd_ms.enable=1 
mysqlnd_ms.ini_file=/path/to/mysqlnd_ms_plugin.ini

之后, 在你指明的mysqlnd_ms_plugin.ini中配置好MySQL的主从库就好了:

[myapp]
master[]=localhost:/tmp/mysql.sock
slave[]=192.168.2.27:3306

从1.1.0开始, 配置文件改为JSON格式、所以新的配置应该类似于如下格式:

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

关于PHP中的配置

[mysqlnd_ms]
extension = mysqlnd_ms.so
mysqlnd_ms.enable = On
mysqlnd_ms.config_file = /etc/mysqlnd_ms.json

然后完整的配置如下:

{  
"dbconnect": {  
    "master": {  
        "master_0": {  
            "host": "127.0.0.1",  
            "socket": "\/tmp\/mysql.sock"  
        }  
    },  
    "slave": {  
        "slave_0": {  
            "host": "127.0.0.2",  
            "port": "3306"  
        }
    },  
    "server_charset" : "utf8",  
    "master_on_write" : 1,  #防止主从读取不一样的情况  
    "failover": {"strategy": "master" }  
}  
}  

然后在PHP中各种数据库连接式改为:

$mysqli = new mysqli("dbconnect", "username", "password", "database");
$pdo = new PDO('mysql:host=dbconnect;dbname=database', 'username', 'password');
$mysql = mysql_connect("dbconnect", "username", "password");

然后就能便捷的实现读写分离了,而代码中不须要做任何的变动!

PHP官网对mysql_ms的详细介绍:http://php.net/manual/zh/book.mysqlnd-ms.php



仅有一条评论 »

  1. dc

    很不错的插件,学习中。。

Feedback

(必填)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。



about me

  • 陶之11's Blog Name:陶之11 OICQ:14779023 Site:Pao11.com

分类

快捷入口