PHP MySQL 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即可。
注意:
如果想使用持久连接,必须在传递给PDO构造函数的驱动选项数组中设置PDO::ATTR_PERSISTENT。如果是在对象初始化之后用PDO::setAttribute()设置此属性,则驱动程序将不会使用持久连接。
如果使用PDO ODBC驱动且ODBC库支持ODBC连接池(有unixODBC和Windows两种做法;可能会有更多),建议不要使用持久的PDO连接,而是把连接缓存留给ODBC连接池层处理。ODBC连接池在进程中与其他模块共享;如果使用了PDO持久连接,则该连接绝不会被返回到ODBC连接池,导致创建额外的连接来服务其他模块。
附上一个关闭pdo连接的方法:
/* * Close Mysql Connection (PDO) */ $pdo_mysql_close = function (PDO $connection) { $query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1); $list = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC); foreach ($list as $thread) { if ($thread['Info'] === $query) { return $connection->query('KILL ' . $thread['Id']); } } return false; }; $pdo_mysql_close($conn);
参看:
http://www.365mini.com/page/php-persistent-connection.htm
https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html
http://codego.net/61869/