什么是php?以及mysqlnd与libmysqlclient
今天想彻底搞清楚php与mysql的关系,于是在php官方网站(http://php.net/manual/en/mysqli.installation.php)
看了一下mysqli,mysql。感觉还是云里雾里,里面有提到:libmysqlclient与mysqlnd,看了下面的文章,清楚了很多。
1. PHP拓展
1.1 PHP核心
PHP的核心是由两个独立的部分组成的。
在最底层是Zend Engine (ZE)。ZE 负责把人类可以理解的脚本解析成机器可以理解的符号(token),然后在一个进程空间内执行这些符号。ZE还负责内存管理,变量作用域,以及函数调用的调度。
另一部分是PHP。PHP负责与SAPI层(Server Application Programming Interface,经常被用来与Apache, IIS, CLI, CGI等host环境进行关联)的交互以及绑定。它也为safemode和openbasedir检查提供了一个统一的控制层,就像streams层把文件和网络I/O与用户空间函数(例如fopen(),fread()和fwrite())关联起来一样。
1.2 拓展形式
PEAR。PEAR是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR就是PHP的CPAN(Perl第三方代码库)。
PECL。PECL(PHP Extension Community Library),PHP的扩展库,它提供了一系列已知的扩展库,由C++等其他语言编写而成,以.so形式出现,.so 为共享库,是shared object,用于动态连接的,和dll差不多,为比PEAR更快,但是与PEAR不同的是,PECL需要在服务器上配置并被注册到主机中。
最直接的表述:Pear是PHP的上层扩展,Pecl是PHP的底层扩展。
2. MYSQL拓展
2.1 如何访问MYSQL数据库
可以使用的PHP拓展有这么几个:
- mysql
- mysqli
- pdo
其中因为mysql是面向过程的,而且无法使用新版本MySQL带来的一些高级特性,现在已经不推荐使用。推荐使用mysqli以及pdo拓展。
但是这三种数据库访问方式,在PHP拓展的角度上看,还是比较上层的拓展,依赖更底层的库去连接和访问数据库。
底层的库,我们目前有这么两个:
- libmysqlclient
- mysqlnd
但是决定使用这两个库中的那一个,是PHP语言编译时的决定,一旦PHP编译完成以后,要更改估计比较困难(我没有尝试过,因此不太肯定)。
2.2 libmysqlclient
这是一个根据 MySQL client/server 协议,使用C语言实现的库。有很多的客户端api使用libmysqlclient这个库去和MySQL Server进行通信(Exceptions are except Connector/J and Connector/Net.)。
2.3 mysqlnd
MySQL Native Driver实现和libmysqlclient同样的功能。但MySQL Native Driver是PHP 5.3.0 官方的代码。
mysqlnd 和 libmysqlclient最大的不同是,mysqlnd 针对与PHP的应用交互进行优化,而libmysqlclient是早期为C应用程序设计的,并没有针对性的优化。
另外,mysqlnd 可以支持很多高级的特性,比如prepared语句支持(曾经在这个prepare的问题上被坑过,当时用的正是libmysqlclient)。
2.4 性能对比
更加详细的对比,移步博文Benchmark: libmysql vs mysqlnd
什么是php?以及mysqlnd与libmysqlclient的更多相关文章
- C语言操作mysql
php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysq ...
- 1 Easy Read/Write Splitting with PHP’s MySQLnd
以下均是使用翻译软件翻译的! Note: This is part one in our Extending MySQL with PHP's MySQLnd Series, read part 2 ...
- error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
zabbix3.2启动有如下报错: # service zabbix_server startStarting zabbix_server: /home/zabbix-server/sbin/zab ...
- 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...
- mysqlnd cannot connect 连接错误处理方法
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administra ...
- phpinfo有mysqlnd没有mysql
这个着实是个坑,使用phpinfo查看,明明有mysqlnd这个项目,就是找不到mysql.以前用直接运行php.exe的方法可以看到错误,可是这次就没有任何错误. 中间把php的安装路径添加到了系统 ...
- Python使用MySQLdb报Library not loaded: libmysqlclient.18.dylib错误
Library not loaded: libmysqlclient.18.dylib就是找不到这个文件,首先要确定是否有这个文件 可以使用find命令,确认位置后可以使用如下两种方法:1.制作软连接 ...
- mysqlnd cannot connect to MySQL 4.1+
phpMyAdmin - error #2000 - mysqlnd cannot connect to MySQL 4.1+ using the old insecure authenticatio ...
- mysql: error while loading shared libraries: libmysqlclient.so.16
[root@host_41 mysql]# mysqlmysql: error while loading shared libraries: libmysqlclient.so.16: cannot ...
随机推荐
- linux-多线程
一.什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立执行的基本单位.线程自己基本上不拥有系统资源,仅仅拥有一点在执行中不可缺少的资源(如程序计数器,一组寄存器和 ...
- TCP并发server,每个客户一个子进程
今天笔者带来的是server型号第一,这是最经常使用的模型的最基本的一个–TCP并发server,每个客户一个子进程. 首先简单介绍:TCP并发server,每个客户一个子进程,并发server调用f ...
- Percona-toolkit的安装和配置-杨建荣的学习笔记
http://blog.itpub.net/23718752/viewspace-2091818/#rd
- jdk安装 java运行编译(不含语法)
一.开发的准备 1.jdk的安装(window) (1)根据自己的电脑下载对应的jdk,并安装 (推荐安装在没有中文的目录中). 网站 http://www.oracle.com/technetwor ...
- Java 实现折半查找
package search; import java.util.*; /*折半查找要求线性表是有序的,假设递增 * 基本思路:R[low...high]是当前的查找区间,首先确定中间位置mid=(l ...
- iOS UIKit:TableView之编辑模式(3)
一般table view有编辑模式和正常模式,当table view进入编辑模式时,会在row的左边显示编辑和重排控件,如图 42所示的编辑模式时的控件布局:左边的editing control有表 ...
- oracle Form Builer:FIND_FORM Built-in
Description Searches the list of forms and returns a form module ID when it finds a valid form with ...
- 转:oracle ebs po模块一揽子采购协议小结
转自:http://yedward.net/?id=193 oracle ebs po模块一揽子采购协议小结 本文总结oracle ebs采购订单(po)模块一揽子采购协议的相关知识,总结如下: 1. ...
- ArrayList的深度copy和浅度拷贝
ArrayList的浅度拷贝方式: 通过Collections.copy方法实现浅度拷贝 ArrayList<GuideGroup> questionGuideGroupList = ne ...
- wxPython ImportError DLL load failed: %1 不是有效的 Win32 应用程序 解决办法
原因:python是32位的,装了64位的Wxpython时会报错,具体错误是安装库文件与python的动态库的位数未一致. 特别留意32位/64位指的不是 系统的位数,而是Python的位数. 64 ...