PHP源码阅读 Day.2 解读PHP底层 mysql的驱动链接

来源:互联网 发布:win10优化版 编辑:程序博客网 时间:2024/06/11 21:02
最近写框架写到了model层,model层是整个框架的核心所在,所有的数据出入都要靠这一层进行操作的,所以model层的好坏基本上决定了框架是否优秀。
首先我用的版本是PHP5.6的默认使用的是mysqli的扩展进行链接数据库的,找到相关的mysqli扩展的源码:
void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_method){    MYSQLI_RESOURCE*mysqli_resource;    MY_MYSQL*mysql;    if (is_method && (Z_MYSQLI_P(getThis()))->ptr) {        return;    }    mysql= (MY_MYSQL*)ecalloc(1,sizeof(MY_MYSQL));#if!defined(MYSQLI_USE_MYSQLND)    if (!(mysql->mysql=mysql_init(NULL)))#else    /*     We create always persistent, as if the user want to connecto     to p:somehost, we can't convert the handle then    */    if (!(mysql->mysql=mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA,TRUE)))#endif    {        efree(mysql);        RETURN_FALSE;    }    mysqli_resource= (MYSQLI_RESOURCE*)ecalloc (1,sizeof(MYSQLI_RESOURCE));    mysqli_resource->ptr= (void*)mysql;    mysqli_resource->status= MYSQLI_STATUS_INITIALIZED;    if (!is_method) {        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);    }else {        (Z_MYSQLI_P(getThis()))->ptr= mysqli_resource;    }}
C语言针对mysql开放了mysql_init的api方便操作mysql数据库,后面我们发现多了一个mysqlnd_init这个函数,具体的情况我大概查了一下。
为什么要使用mysqlnd
原来的libmysql用的好好的,为什么还要搞一个mysqlnd出来呢?
原因一: license问题(说白了zend公司不想跟oracle在版权上发送任何冲突)
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. 使用mysqlnd之后,mysqli也支持persistent connection(持久链接)了。
4.mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力,使用mysqli之后不必考虑数据库连接池的问题了。
这样看起来,mysqli受益最多。
在php_mysqli_structs.h文件中
#ifdef MYSQLI_USE_MYSQLND#include"ext/mysqlnd/mysqlnd.h"#include"mysqli_mysqlnd.h"
所以PHP5.4以及高版本之后默认使用的是mysqlnd底层链接的数据库了,5.4版本默认也是mysqli了。

5.0.x, 5.1.x, 5.2.xlibmysql不适用--with-mysqli=/path/to/mysql_config 5.3.xlibmysql--with-mysqli=mysqlnd--with-mysqli=/path/to/mysql_configmysqlnd is now supported5.4.xmysqlnd--with-mysqli--with-mysqli=/path/to/mysql_configmysqlnd is now the default



0 0
原创粉丝点击