2016-02-17 3 views
1

Прямо сейчас, каждый раз, когда мне нужно запускать запрос, я вызываю функцию с именем connection(), которая создает новый объект PDO.Как я могу хранить объекты 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 для оптимизации производительности?

Я использую эту функцию в нескольких файлах, поэтому мне это нужно.

+0

Хранить его в переменной и передать его вокруг? – frz3993

+0

Ваш запрос работает? Потому что я думаю, что '$ db' имеет значение null ... – fusion3k

+0

Вы используете MVC? Создайте его внутри метода '__construct()' как переменную класса внутри вашей модели и ссылайтесь на нее оттуда. Если вы не используете MVC, храните фактическую переменную '$ db' в начале вашего кода и ссылайтесь на нее в другом коде. Кроме того, функция 'connection' не возвращает ваш новый объект PDO. Мне интересно, если это работает прямо сейчас? –

ответ

1

Что-то вроде этого, может быть,

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; 
} 

Это может делать то, что вы хотите без особых дополнительных изменений.

+1

Зло верно. – CodeGodie

+0

Это своего рода очень простая реализация псевдо-синглов –

+0

да, но почему бы не сделать это правильно? – CodeGodie

2

Что делать, если вы создаете файл config.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(); 
0

Несколько людей уже упомянутые статические и шаблон Singleton. Это будет выглядеть код, поддерживающий только один экземпляр объекта 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(); 
+0

Обратите внимание, что [вы никогда не должны ловить ошибки, чтобы сообщить об этом] (https://phpdelusions.net/pdo#errors) –

+0

Вы правы. Это была быстрая демонстрация, ориентированная на развитие, а не на производство. – fredrover

+0

«Никогда» означает ** ни на выпуск, ни на производство. ** И в быстрых демонстрациях. –

Смежные вопросы