2013-06-03 5 views
4

Я использую эту функцию для подключения к моему MySQL db, когда это необходимо, а также для повторного использования одного и того же объекта соединения для любого последующего запроса, который может понадобиться в том же скрипте php.Повторное использование объекта подключения базы данных

function cnn() { 
    static $pdo; 
    if(!isset($pdo)) { 
     try { 
      $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS); 
      $pdo->setAttribute(PDO::ATTR_TIMEOUT, 30); 
      $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 
      return $pdo; 
     } catch(PDOException $e) { 
      http_response_code(503); 
      echo $e->getCode.': '.$e->getMessage(); 
      die(); //or whatever error handler you use 
     } 
    } else { 
     return $pdo; 
    } 
} 

Первый запрос (объект создается)

echo cnn()->query('SELECT firstname FROM user WHERE id=4;')->fetch(PDO::FETCH_COLUMN) 

Второй запрос (объект повторно)

echo cnn()->query('SELECT title FROM news WHERE id=516;')->fetch(PDO::FETCH_COLUMN) 

Согласны ли вы на такой подход? Как вы думаете, его можно оптимизировать? Спасибо за ваше мнение.

+0

Что делать, если вам нужно закрыть это соединение? Как вы хотите определить, активна ли она (не закрыта)? – BlitZ

+0

Как далеко вы хотите, чтобы он был оптимизирован? С точки зрения ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО мало оптимизации, вы должны сохранить его во временной переменной, это будет одна сборка 'MOVE', а не' CALL' и 'BRANCH', но эй, это как один мкс. = D – Jerska

+0

@CORRUPT Обычно PHP закрывает соединение, когда скрипт заканчивается. В этом случае я использую постоянные соединения (строка 6), что означает, что соединения не закрыты в конце скрипта, но кэшируются и повторно используются, когда другой скрипт запрашивает соединение с использованием тех же учетных данных. Тем не менее, я думаю, не помешает добавить параметр, который, если true, устанавливает $ pdo в null. – andufo

ответ

3

Я согласен с этим методом, хотя многие люди скажут вам, что этот подход «singleton» плох, плох.

Однако я не согласен с вашей реализацией. Оно должно быть:

function cnn() { 
    static $pdo; 
    if(!$pdo) { 
     $conf = array(PDO::ATTR_TIMEOUT => 30, 
        PDO::ATTR_PERSISTENT => true, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
      ); 
     $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME; 
     $pdo = new PDO($dsn, DB_USER, DB_PASS, $conf); 
    } 
    return $pdo; 
} 

Кроме того, это выглядит разумным, чтобы переместить код обработчика в обработчик

function my_exceptionHandler($exception) { 
    http_response_code(503); 
    if (ini_get('display_errors')) { 
     echo $e->getMessage().$e->getTrace(); 
    } else { 
     log_error($e->getMessage().$e->getTrace()); 
    } 
    die(); //or whatever error handler you use 
} 
set_exception_handler("my_exceptionHandler"); 

Кроме того, я бы продлить (и конечно без вторя ошибку безоговорочно!) он должен принять параметр, чтобы сделать несколько соединений возможными.

+0

Спасибо за ваш код. Тем не менее, один вопрос: какие преимущества могут сделать несколько соединений? (при условии, что существует только один бит) – andufo

+0

Предположим, у вас есть несколько db для подключения. –

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