一个函数引发的MySQL驱动问题

有些话、适合烂在心里 提交于 2019-12-02 07:12:28

前两天在一个php脚本中使用mysqli_fetch_all()来获取全部结果集,但却提示该方法undefined,只好退回,使用mysql_fetch_row()这个方法,一行一行的获取记录,效率很慢。后来查询得到:

1, mysqli_fetch_all()这个函数只存在于mysqlnd中,也就是PHP的原生MySQL驱动中。

2, mysqlnd: PHP手册上的描述:MySQL Native Driver is a replacement for the MySQL Client Library (libmysql). MySQL Native Driver is part of the official PHP sources as of PHP 5.3.0. (mysqlnd是libmysql的一个替代,mysqlnd是从PHP5.3.0版本之后,官方PHP资源的一部分)。libmysql驱动是比较老的驱动,PHP 5.3开始已经不建议使用它了,而建议使用mysqlnd。

3,传统的安装php的方式中,我们在编译PHP时,一般需要指定以下几项:

--with-mysql=/usr/local/mysql 
--with-pdo-mysql=/usr/local/mysql

这实际上就是使用了mysql官方自带的libmysql驱动, 这是比较老的驱动, PHP 5.3开始已经不建议使用它了, 而建议使用mysqlnd.

4, 为何要使用mysqlnd驱动? PHP官方手册描述:

A. libmysql驱动是由mysql AB公司(现在是oracle公司)编写, 并按mysql license许可协议发布,所以在PHP中默认是被禁用的。而mysqlnd是由php官方开发的驱动,以php license许可协议发布,故就规避了许可协议和版权的问题。

B. 因为mysqlnd内置于PHP源代码,故你在编译安装php时就不需要预先安装mysql server也可以提供mysql client API (mysql_connect,pdo,mysqli),这将减化一些工作量。

C. mysqlnd是专门为php优化编写的驱动,它使用了PHP本身的特性,在内存管理,性能上比libmysql更有优势。php官方的测试是:libmysql将每条记录在内存中保存了两份,而mysqlnd只保存了一份。

D. 一些新的或增强的功能:
--- 增强的持久连接;

--- 引入特有的函数mysqli_fetch_all()
--- 引入一些性能统计函数 mysqli_get_cache_stats(),mysqli_get_client_stats(),mysqli_get_connection_stats()。使用上述函数,可很容易分析mysql查询的性能瓶颈!

--- SSL支持(从php 5.3.3开始有效);
--- 压缩协议支持;
--- 命名管道支持(php 5.4.0开始有效);

5,如何使用mysqlnd驱动?编译php时,修改以下几个项参数即可:

--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd

提示: 如果使用mysqlnd,并不需要预先安装mysql。
验证:如果在phpinfo()输出的mysql项中发现 client API Version:mysqlnd, 说明mysqlnd驱动安装成功。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!