2013-06-03 2 views
4

필자는 필요할 때이 함수를 사용하여 MySQL 데이터베이스에 연결하고 동일한 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 title FROM news WHERE id=516;')->fetch(PDO::FETCH_COLUMN) 

당신은이 방법에 동의하십니까 (객체 재사용)

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

두 번째 쿼리 (객체가 만들어집니다)? 그것이 최적화 될 수 있다고 생각합니까? 의견을 보내 주셔서 감사합니다.

+0

연결을 닫아야하는 경우 어떻게해야합니까? 활성 상태인지 (닫히지 않았는지) 어떻게 결정 하시겠습니까? – BlitZ

+0

얼마나 최적화하고 싶습니까? 정말로 작은 최적화 측면에서 임시 변수에 저장해야합니다. 즉, CALL과 BRANCH 대신 MOVE 일 수 있지만, 1 μs와 같습니다. = D – Jerska

+0

@CORRUPT 일반적으로 스크립트가 끝나면 PHP는 연결을 닫습니다. 이 경우 영구 연결 (6 행)을 사용하고 있습니다. 즉, 연결이 스크립트 끝에서 닫히지 않지만 다른 스크립트가 동일한 자격 증명을 사용하여 연결을 요청할 때 캐시되고 다시 사용됩니다. 그래도 사실이라면 $ pdo를 null로 설정하는 매개 변수를 추가하는 것이 좋습니다. – andufo

답변

3

많은 사람들이이 "싱글 톤"방식이 나쁘다고 말합니다.

그러나 귀하의 구현에 동의하지 않습니다. 그것은해야한다 :

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가 있다고 가정합니다. –