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了。
0 0
- PHP源码阅读 Day.2 解读PHP底层 mysql的驱动链接
- PHP源码阅读 Day.1,源码目录结构分析
- Yii2底层源码解读系列之一 入口文件index.php
- Day 1 :apache + php + mysql 的配置
- Day 3:php+mysql留言板的设计
- mysql源码阅读笔记 (1) 底层物理页面的数据结构
- mysql与php的链接
- PHP与MySQL的链接
- php 源码阅读 chr
- PHP源码阅读<1>
- PHP的底层实现
- 一个底层驱动函数的解读
- php链接mysql
- php 链接mysql数据库
- PHP链接MySQL数据库
- PHP链接MYSQL数据库
- php链接mysql数据库
- PHP链接MYSQL
- 剑指offer(C++)——矩阵覆盖
- [JZOJ5086]数列
- softmax分类器 python实现
- HDU 3367:Pseudoforest
- Java中设计模式之单例设计模式-1
- PHP源码阅读 Day.2 解读PHP底层 mysql的驱动链接
- __ATTRIBUTE__ 你知多少?
- HZAU 1202 GCD( 斐波那契数列+矩阵快速幂)
- HocTracker:动态社会网络的群组演化追踪
- 回文子序列 ssl 2662 暴力
- opencv学习笔记-openCV2与opencv3机器学习库MLL
- ~二维数组中的查找~
- Retrofit
- A C M time