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

最近写框架写到了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 supported
5.4.xmysqlnd--with-mysqli--with-mysqli=/path/to/mysql_configmysqlnd is now the default



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值