无论是何种编程语言,几乎都要经常与各种数据库打交道。不过,众所周知的是,在程序与数据库之间建立连接是一件比较耗费资源的事情,因此编程技术领域的许多专家、前辈们就设想并提出了各种解决方案,以减少不必要的资源浪费,从而提高程序对数据库的访问能力。
在程序与数据库的许多连接方案中,最广为人知、也是应用得最广泛的解决方案就是使用数据库连接池。不过,我们今天要介绍的主角并不是连接池,毕竟自行编写代码创建连接池或者使用第三方现有的连接池解决方案,都显得有些麻烦。在PHP中,我们还可以使用一种更为简单直接的数据库连接方案——PDO持久化连接。
关于PDO本身,这里就不再多作介绍了,大家可以参考之前的文章《使用PDO连接多种数据库》以及PHP官方网站上的相关信息。
PDO持久化连接的使用非常简单。同样以文章《使用PDO连接多种数据库》中的代码为例,我们使用PDO持久化连接的方式来访问数据库,代码如下:
- <?php
- $type = 'mysql'; //数据库类型
- $db_name = 'test'; //数据库名
- $host = '127.0.0.1';
- $username = 'root';
- $password = 'ready';
- $dsn = "$type:host=$host;dbname=$db_name";
- try {
- //建立持久化的PDO连接
- $pdo = new PDO($dsn, $username, $password, array(PDO::ATTR_PERSISTENT => true));
- } catch (Exception $e) {
- die('连接数据库失败!');
- }
- $stmt = $pdo->query('SELECT id, body FROM demo');
- while ($row = $stmt->fetch()) {
- echo "id=$row[0],body=$row[1]<br/>";
- }
- $pdo = null;
- ?>
从上述代码中可以看到,建立PDO持久化连接只需要在PDO构造函数的第4个参数(该参数为可选参数,是一个包含多个驱动选项参数的数组)中设置键名PDO::ATTR_PERSISTENT
的值为true
即可。除此之外,其使用方式与非持久化连接保持一致。
在PHP中,我们使用new PDO()
语句创建一个数据库连接,当连接数据库成功后,将会得到一个PDO类的实例,此连接在PDO对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个NULL值给对象变量。如果不明确地这么做,PHP在脚本结束时会自动关闭连接。
不过,当我们创建的数据连接为PDO持久化连接时,该连接在使用完毕或者PHP脚本结束后并不会被关闭,而是被PHP缓存起来。当另一个使用相同凭证(主机、端口、数据库名、用户名、密码等信息完全一致)的PHP脚本请求建立连接时,PHP将直接返回之前被缓存起来的连接,从而达到连接重用。持久连接缓存可以避免每次访问数据库都要建立一个新连接的开销,从而让web应用程序更快。
注意
-
如果想使用持久连接,必须在传递给PDO构造函数的驱动选项数组中设置
PDO::ATTR_PERSISTENT
。如果是在对象初始化之后用PDO::setAttribute()
设置此属性,则驱动程序将不会使用持久连接。 -
如果使用PDO ODBC驱动且ODBC库支持ODBC连接池(有unixODBC和Windows两种做法;可能会有更多),建议不要使用持久的PDO连接,而是把连接缓存留给ODBC连接池层处理。ODBC连接池在进程中与其他模块共享;如果使用了PDO持久连接,则该连接绝不会被返回到ODBC连接池,导致创建额外的连接来服务其他模块。