浅谈MySQL Capabilities --从调研PHP mysqlnd源码细节角度认识
今天一起来研究下MySQL Capabilities,这个非常重要,如果大家有想法自己动手实现一个MySQL客户端或者Proxy工具,那么就得先了解一下这块,正好PHP 5.3以上版本由于官方为了规避许可协议和版权的问题而开发mysqlnd驱动(mysql native driver),而且据资料显示其性能比libmysql驱动要高不少,直接步入正题,在开始前,说明一下,以下的源码部分是来源于php 5.5.10版本。
假如有这么一个场景:
运维A:老大,最近调研发现php 5.5版本性能提升了不少,咱们的游戏web后台php版本要不要来一下?
老大:新版本有啥优势啊?
运维A:新增了mysqlnd这个牛逼的驱动,咱们编译代码再也不用记着打开libmysql选项了,减少工作量之余,关键是这个驱动比libmysql牛逼多了。
老大:但是咱们中间有一层自制的mysql proxy,这个驱动对他的支持是否友好?
运维A:这个...,得测试一下哈
….
baba,编译php 5.5版本几个小时过去了,终于搞定了,写个小程序连接一下mysql proxy…
事情发生了,怎么回事?怎么连不上了?发生什么事了?马上打电话给mysql proxy开发小组咨询一下为啥php 5.5版本连接不上mysql proxy?于是mysql proxy开发小组开始深入调研一下,原来proxy的Capabilities没设置好,顺手还研究了一下php mysqlnd的源码,发现原来真相在ext/mysqlnd/mysqlnd_enum_n_def.h的第105行的MYSQLND_CAPABILITIES宏,原来mysqlnd默认开启的标志还真不少,而咱的proxy实现还没支持这么多标志,所以只能断开链接了
#define MYSQLND_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | \
CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | \
CLIENT_MULTI_RESULTS | CLIENT_PS_MULTI_RESULTS | CLIENT_LOCAL_FILES | CLIENT_PLUGIN_AUTH)
接下来再看看这个标志是在哪里调用,发现原来隐藏在ext/mysqlnd/mysqlnd.c的第713行
/* {{{ mysqlnd_conn_data::get_updated_connect_flags */
static unsigned int
MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags TSRMLS_DC)
{
MYSQLND_NET * net = conn->net;
DBG_ENTER("mysqlnd_conn_data::get_updated_connect_flags");
/* we allow load data local infile by default */
mysql_flags |= MYSQLND_CAPABILITIES;
mysql_flags |= conn->options->flags; /* use the flags from set_client_option() */
if (PG(open_basedir) && strlen(PG(open_basedir))) {
mysql_flags ^= CLIENT_LOCAL_FILES;
}
#ifndef MYSQLND_COMPRESSION_ENABLED
if (mysql_flags & CLIENT_COMPRESS) {
mysql_flags &= ~CLIENT_COMPRESS;
}
#else
if (net && net->data->options.flags & MYSQLND_NET_FLAG_USE_COMPRESSION) {
mysql_flags |= CLIENT_COMPRESS;
}
#endif
#ifndef MYSQLND_SSL_SUPPORTED
if (mysql_flags & CLIENT_SSL) {
mysql_flags &= ~CLIENT_SSL;
}
#else
if (net && (net->data->options.ssl_key || net->data->options.ssl_cert ||
net->data->options.ssl_ca || net->data->options.ssl_capath || net->data->options.ssl_cipher))
{
mysql_flags |= CLIENT_SSL;
}
#endif
DBG_RETURN(mysql_flags);
}
/* }}} */
而get_updated_connect_flags又是在哪里调用呢?再调研一下,发现是在ext/mysqlnd/mysqlnd.c的第956行
/* {{{ mysqlnd_conn_data::connect */
static enum_func_status
MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
const char *host, const char *user,
const char *passwd, unsigned int passwd_len,
const char *db, unsigned int db_len,
unsigned int port,
const char *socket_or_pipe,
unsigned int mysql_flags
TSRMLS_DC)
{
… ...
mysql_flags = conn->m->get_updated_connect_flags(conn, mysql_flags TSRMLS_CC);
if (FAIL == conn->m->connect_handshake(conn, host, user, passwd, passwd_len, db, db_len, mysql_flags TSRMLS_CC)) {
goto err;
}
而再找找connect,发生是在ext/mysqlnd/mysqlnd.c 的第1131行里调用,mysqlnd_connect看起来有点熟悉,没错这个就是官方开发的mysqlnd驱动,而大名顶顶的PDO正是调用这个来连接mysql,具体编译方式大家再google一下,这里就不展开了。
/* {{{ mysqlnd_connect */
PHPAPI MYSQLND * mysqlnd_connect(MYSQLND * conn_handle,
const char * host, const char * user,
const char * passwd, unsigned int passwd_len,
const char * db, unsigned int db_len,
unsigned int port,
const char * socket_or_pipe,
unsigned int mysql_flags
TSRMLS_DC)
{
enum_func_status ret = FAIL;
zend_bool self_alloced = FALSE;
DBG_ENTER("mysqlnd_connect");
DBG_INF_FMT("host=%s user=%s db=%s port=%u flags=%u", host?host:"", user?user:"", db?db:"", port, mysql_flags);
if (!conn_handle) {
self_alloced = TRUE;
if (!(conn_handle = mysqlnd_init(FALSE))) {
/* OOM */
DBG_RETURN(NULL);
}
}
ret = conn_handle->m->connect(conn_handle, host, user, passwd, passwd_len, db, db_len, port, socket_or_pipe, mysql_flags TSRMLS_CC);
总结:
从php mysqlnd驱动源码可以学习到如何设计一个mysql客户端,并且在设计过程中如何设计MySQL Capabilities
具体的MySQL Capabilities说明可详细阅读http://dev.mysql.com/doc/internals/en/capability-flags.html
以上就是今天要分享的小细节,希望对大家理解MySQL Capabilities方面的相关细节有所帮助,祝玩得开心!
浅谈MySQL Capabilities --从调研PHP mysqlnd源码细节角度认识的更多相关文章
- 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- MySQL多版本并发控制机制(MVCC)-源码浅析
MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<事务处理-概念与技术>>诚然 ...
- Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码)
Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码) 备注: 之前在Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合中 ...
- MySQL数据库的二进制安装、源码编译和基础入门操作
一.MySQL安装 (1)安装方式: 1 .程序包yum安装 优点:安装快,简单 缺点:定死了各个文件的地方,需要修改里边的相关配置文件,很麻烦 2 .二进制格式的程序包:展开至特定路径,并经过简单配 ...
随机推荐
- zabbix4.2学习笔记--用自带的mysql监控模块
这里演示监控zabbix本身用到的mysql 第一步:建立mysql监控用户 在生产环境中,出于安全考虑,建议监控客户端数据库时,单独配置一个查询权限用户做查询操作即可 # 撤掉安装时给予的分配单个数 ...
- 网络测速命令--speedtest
网络测速 speedtest-cli 顾名思义,这个命令为网络测速命令,基于Python编写,测试系统网络的上传下载速度,GitHub托管的项目地址,以下列出常见的用法 安装命令 pip instal ...
- hdfs深入:06、hdfs的写入过程
7.HDFS的文件写入过程 详细步骤解析: 1. client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传: 2. ...
- Web项目ConcurrentModificationException异常
后台SSH在做Session删除的时候,遇到了ConcurrentModificationException异常. 参考资料:http://blog.csdn.net/idesvo/article/d ...
- 全国高校json数据包(复python解析代码)
由于这段时间需要有关学校的三级联动插件,找了很久没有找到合适的,所以去教育部官网下载了一份全国普通高校名单(2019年), 这里附上解析该xls文件的代码 import xlrd import jso ...
- selenium实战演练
利用selenium以及pyquery,爬取当当网图书信息,并且将数据存入文件以及MongoDB数据库中. 配置文件: key="python" MONGO_URL='localh ...
- NOI模拟(3.6)Assignment
Description 随机生成一个长度为m且每个元素都为1~n之间的整数的单调不下降序列~(即序列的(i>1)都不小于),(随机生成指每一种可能的序列都等概率被生成).请问这个序列的众数出现次 ...
- 我们参与投资36Kr股权众筹项目“易途8”的决策过程
背景 中文接机.中文送机.中文包车. 当地玩乐 最大的竞争对手:皇包车,15年9月A轮 其它对手:唐人接等,订单量无法和 皇包车.易途8比. 看好理由 1.旅游行业和境外自由行,是 ...
- java程序验证用户名密码和验证码登录的小例子
package Study02; import java.util.Random; import java.util.Scanner; public class test { static Strin ...
- noip模拟赛 少女
分析:每个连通块都是独立的,对一个连通块进行分析.如果边数>点数,显然是不可能的,因为每条边要分配给一个点,至少有一个点分配了两次以上.如果边数=点数,就形成了环,有两种方案,顺时针一个环,逆时 ...