为什么持久性PDO连接会与每个请求建立新连接?

时间:2016-12-15 10:32:14

标签: php mysql pdo

这是我通过PDO持久连接连接MySQL的数据库类:

class database{
    private $_db;
    public function conn()
    {
        $user = 'xxx';
        $pass = 'xxxxxxx';
        try
        {
           $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true));
           $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
           return $this->_db;
        }

        catch(PDOException $e)
        {
           return "-1";
        }
    }

}

我在另一个函数中调用此类来查询数据库。每次调用该函数时,都会在数据库中创建一个新连接。为什么持久性pdo连接会根据请求建立新连接?

2 个答案:

答案 0 :(得分:1)

在再次连接之前,您需要检查连接是否已建立。这可以通过向您在conn()方法 -

中调用的类添加快速方法来实现
class database{
    private $_db;

    private function isConnected()
    {
        return ($this->_db) ? TRUE : FALSE;
    } 

    public function conn()
    {

        if ($this->isConnected()) 
        {
            return $this->_db;
        } else {

            $user = 'xxx';
            $pass = 'xxxxxxx';
            try
            {
               $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true));
               $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
               $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
               return $this->_db;
            }

            catch(PDOException $e)
            {
               return "-1";
            }
        }
    }

}

此代码将返回现有连接(如果存在),如果不存在,则返回新连接。

答案 1 :(得分:0)

我正在使用我在项目开始时定义的静态类,唯一不好的部分是你无法创建多个数据库。

<?php

/**
 *
 ************************************************
 *                 PlainFramework               *
 ************************************************
 *
 *   Created by Niels Hamelink
 *   File: class.database.php
 *   Created at: 14-11-2016 02:08
 **/
class Database
{
    private static $_db;

    public static function connect($dsn, $username, $password, $debug)
    {
        try
        {
            $_db = new PDO($dsn, $username, $password);
        } catch(PDOException $e)
        {
            if($debug)
                Application::throw_error($e->getMessage());
        }
    }

    public static function close()
    {
        $_db = null;
    }

    public static function isConnected()
    {
        return isset($_db)
            && $_db != null;
    }

    public static function getPDO()
    {
        if(!isset($_db))
            $_db = null;

        return $_db;
    }

    public static function executeQuery(Query $query)
    {
        try
        {
            return Database::getPDO()->query($query->toString());
        } catch(PDOException $ex)
        {
            Application::throw_error($ex->getMessage());
        }
    }

}