Tagged: 数据库

php –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd

1、什么是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

mysqldnd即MySQL Native Driver简写,即是由PHP源码提供的mysql驱动连接代码,它的目的是代替旧的libmysql驱动。

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

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

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

2、PDO与mysqlnd, libmysql又是何种关系?

PDO是一个应用层抽象类,底层和mysql server连接交互需要mysql驱动的支持。也就是说无论你使用了何种驱动,都可以使用PDO.
PDO提供了PHP应用程序层API接口,而mysqlnd,libmysql则负责与mysql server进行网络协议交互(它并不提供php应用程序层API功能)

3、为何要使用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开始有效)

4、看到这里,你可能跃跃欲试,很想使用mysqlnd驱动

提示: 如果使用mysqlnd,并不需要预先安装mysql
编译php时,修改以下几个项参数即可
[code lang="shell"]--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd [/code]

Starting MySQL… ERROR! The server quit without updating PID file

刚编译完 MySQL 遇到这个问题?? 别着急,下面是本人总结,据说看完的99%都解决了!

1、你初始化数据库了吗??[code]/usr/local/mysql/bin/mysql_install_db [/code]

2016-05-25 19:56:18 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-05-25 19:56:18 [ERROR] The data directory needs to be specified.

我的是 MySQL 5.7,新版已经改成用 mysqld --initialize 来初始化数据库了[code]/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql[/code]注意:
1)后面的参数一定要加上,--user代表运行用户,--basedir代表MySql安装目录,--datadir代表数据库数据所在目录,每个人的配置不一样,根据自己的编译参数修改一下。
2)执行前,请先清空编译前指定的datadir,默认是在安装目录的data/(我编译时指定在了/data/mysql),否则会报如下错误:

--initialize specified but the data directory has files in it. Aborting.
2016-05-25T12:07:27.006980Z 0 [ERROR] Aborting

2、可能是 datadir 目录没有写的权限
[code]chown -R mysql:mysql /data/mysql && chmod -R 755 /data/mysql[/code]
3、错误日志文件没有权限(根据你的编译参数和my.cnf查看你的错误文件路径)
[code][chown -R mysql:mysql /var/log/mysqld.log && chmod -R 755 /var/log/mysqld.log[/code]
4、可能进程里已经存在mysql进程[code]ps -ef | grep mysql[/code]如果有使用 “kill -9 进程号” 杀死,然后重新启动mysqld!

5、可能是第二次在机器上安装MySQL,有残余数据影响了服务的启动。
清空之前的 datadir 目录,和MySQL安装目录,如果存在mysql-bin.index,就赶快把它删除掉吧。

6、MySQL在启动时没有指定配置文件时会使用 /etc/my.cnf 配置文件,请打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir)。
请在[mysqld]下设置这一行:[code]datadir = /data/mysql[/code]
7、skip-federated字段问题
检查一下/etc/my.cnf文件中有没有没被注释掉的 skip-federated 字段,如果有就立即注释掉吧。

8、selinux惹的祸,如果是centos系统,默认会开启selinux
关闭它,打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled后存盘退出重启机器试试。

微信公众号:程序员到架构师

最新文章

Return Top