升级到php5.3要注意的事项

一.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才是未来的。

你可能感兴趣的:(PHP)