PDO 小知识

一、前言

PDO(PHP Data Object)提供了一个通用接口访问多种数据库,即抽象的数据模型支持连接多种数据库。

PDO扩展为PHP定义了一个访问数据库的轻量、持久的接口。其本身并不能实现任何数据库操作,必须使用一个特定的数据库PDO驱动访问数据库,实现PDO接口的每一种数据库驱动都能以正则扩展的形式把各自的特色表现出来。意味着不管使用哪种数据库,都可以使用同样一组API对数据库进行操作。

在PHP中,链接MySQL的几种方式:

  • MySQL系列函数(PHP 7已弃用)
  • MySQLi系列函数,是上面的增强版,增加了预编译和参数绑定等新特性
  • PDO

二、PDO预定义的类

详见:https://www.php.net/manual/zh/book.pdo.php

PDO、PDOStatement 和 PDOException

PDO类(代表一个PHP和数据库之间的链接)。

PDOStatement类(代表一条预处理语句以及语句执行后的联合结果集)。

PDOException类 (对Exception的简单重写)。

三、PDO参数绑定与与预编译

PHP使用prepare API默认不是使用参数绑定和预编译,主要是考虑最大兼容性问题,因为有些数据库不支持预编译功能,所以默认使用了SQL拼接来模拟预编译(转移、加单引号)。

如果使用了真正的预编译($pdo->setAttribute(PDO::ATTR_EMULATE_PERPARES, false); //使用本地预处理语句,而非模拟),客户端需要分两次发送:1、SQL模板;2、SQL查询参数,也就是多了一次网络请求开销,但并不会影响性能,因为预编译的过程只发生在第一次请求,一旦编译成功,第二次就能直接使用了,不需要二次编译(是同一Session,即每次请求中的多次调用时只存在一次预编译)。

MySQL支持预编译,但还是比较弱的,仅仅支持Session级别,PHP的每次请求都会是一次全新的会话,所以每次请求必然都需要重新做一次预编译。但是如果使用了连接池技术的话,就能让多次PHP请求使用同一数据连接Session,从而达到提高预编译性能的目的。

四、PDO事务处理

脚本结束或者一个连接要关闭时,如果还有一个未处理完的事务,PDO自动将其回滚。这对于脚本意外终止情况来说是一个安全方案。如果没有明确地提交事务,它将假设发生一些错误,为数据的安全执行回滚。

五、PDO效率问题

来自第三方测试:

PHP5.3、60多个表、2GB的数据,PDO的CURD效率比MySQL直连低5%~15%。

PDO开启长连接后负载高于MySQL直连且比较稳定,连接速度也有优势。

实际应用中,90%的程序是不会进行数据库迁移的,似乎PDO必要性也不大。

综上:推荐新应用中尝试使用PDO,旧应用则没有必要进行重构。其实目前主流框架底层基本是PDO实现。

猜你喜欢

转载自www.cnblogs.com/cshaptx4869/p/11575526.html
PDO
今日推荐