一.php5.3其中的一个新特性是mysqlnd成为php 5.3中的默认mysql驱动
如果你用的PDO连接MYSQL :
$pdbo = new PDO("mysql:host=localhost;dbname=test", 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
就会报错:
Fatal error: Undefined class constant MYSQL_ATTR_INIT_COMMAND'
这是因为php5.3.0的一个BUG,不支持PDO::MYSQL_ATTR_INIT_COMMAND!
解决办法有两种:
1.
$pdbo = new PDO("mysql:host=localhost;dbname=test", 'root', '');
$pdbo->exec("SET NAMES utf8");
2.
获取最新版本:windows版 linux版
二.你的代码本来没有报错。但是升级之后无缘无故报了好多警告错误,例如:
Deprecated: Function split() is deprecated
这是因为php5.3.0新增了两个错误模块E_USER_DEPRECATED and E_DEPRECATED
E_DEPRECATED用来告知某个函数或变量会在未来的php版本中丢弃
解决办法:在php.ini中设置error_reporting = E_ALL & ~E_DEPRECATED
或者在代码中添加error_reporting(E_ALL & ~E_DEPRECATED);
如果你使用set_error_handler来处理异常,由于set_error_handler不受error_reporting影响,你可以再代码里这样做
$error_reporting = ini_get('error_reporting');
set_error_handler("error_handler",$error_reporting);
function error_handler(){
//自定义处理错误的函数
}
一直以来,php都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlnd有效降低内存的使用以及提高性能。 具体 可以看:
http://dev.mysql.com/downloads/connector/php-mysqlnd/
http://forge.mysql.com/wiki/PHP_MYSQLND
从图中可以看出,使用mysqlnd少了从mysql驱动中复制 数据 到php扩展这一步。mysqlnd使用copy-on-write,也就是写时复制,读引用。
mysqlnd已经内置在php5.3的源码中,编译的时候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安装mysqlnd驱动。
mysqlnd的优点
编译php更方便了,不需要libmysql,已经内置在源码中
使用php许可,避免版权问题
使用php的内存管理,支持php内存限制(memory_limit)
所有数据在内存只有一份,之前的libmysql有两份,参考上图
提供性能统计功能,帮助分析瓶颈
mysqli支持长连接(persistent connections)
性能绝对比libmysql要快
在驱动层增加缓存机制
看了这么多特点,有点矛盾,作为 数据库 抽象层的PDO能把不同后端的特点发挥出来吗?如果使用mysql作为数据库的话mysqli是不是更好的选择?我总觉得mysqli只是个过度产品,PDO才是未来的。