如何存储 PDO 对象


How can i store PDO objects

现在,每次我需要运行查询时,我都会调用一个名为connection()的函数来创建新的PDO对象。

function connection(){
    $host   = 'localhost';
    $user   = 'user';
    $pass   = 'password';
    $dbName = 'db_name';
    new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
}
$db = connection();
$query = 'SELECT ...';
$stmt  = $db->prepare($query);
$stmt->execute();

问题是网站创建此对象需要 1 秒,正如您可以想象的那样,如果我需要运行 4 个查询,页面将在 4 秒内加载。那么,有什么方法可以存储这个PDO对象来优化性能吗?

我在多个文件中使用此功能,所以我需要它。

如果您创建一个包含在页面顶部的配置.php文件怎么办。您只需要创建一次对象,页面上的所有查询都可以引用同一个对象:

function connection(){
    $host   = 'localhost';
    $user   = 'user';
    $pass   = 'password';
    $dbName = 'db_name';
    new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
}
$db = connection();
$query = 'Statement #1';
$stmt  = $db->prepare($query);
$stmt->execute();
$query = 'Statement #2';
$stmt  = $db->prepare($query);
$stmt->execute();
$query = 'Statement #3';
$stmt  = $db->prepare($query);
$stmt->execute();
$query = 'Statement #4';
$stmt  = $db->prepare($query);
$stmt->execute();

也许是这样的

function connection(){
    static $CONN;
    if (!$CONN) {
        $host   = 'localhost';
        $user   = 'user';
        $pass   = 'password';
        $dbName = 'db_name';
        $CONN = new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
    }
    return $CONN;
}

这可能会做你想要的,而无需太多额外的更改。

有几个人提到了静态和单例模式。代码如下所示,一次只保留 PDO 对象的一个实例:

class DB{
     private static $_instance;
     private $_pdo;
     public static function getInstance(){
         if(self::$_instance === NULL) {
            $dsn = 'mysql:dbname=dbname;host=host';
            $user = 'user';
            $password = 'password';
            // call constructor and assign instance
            self::$_instance = new self($dsn, $user, $password);
        }
        return self::$_instance;
    }
    /**
     * Creates new DB wrapping a PDO instance
     *
     * Constructor is private because this class can't be instantiated.
     *
     */
    private function __construct($dsn, $user, $password){
        try {
            $this->_pdo = new PDO($dsn, $user, $password);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }
     }
    /**
     * Singletons may not be cloned
     */
    private function __clone() {}

    /**
     * Delegate every method call to PDO instance
     *
     * @param  String $method
     * @param  Array  $args
     * @return Mixed
     */
    public function __call($method, $args) {
        return call_user_func_array(array($this->_pdo, $method), $args);
    }
}
// To instantiate:
$db = DB::getInstance();