2011-04-28 4 views
0

DB 및 PDO 문을 정적으로 캐싱하기 위해 스크립트를 사용하고 있습니다. 여기데이터베이스 연결 캐싱 문제가 발생했습니다.

내가 페이지 캐싱하지만 전역의 $ _SESSION 캐싱

에서뿐 아니라 정적이를 만들고 싶어하지만 내 연결 방법은

private static function CONNECT() 
{ 
    if(self::$dbConn === null) 
    { 
     if(isset($_SESSION['X_DB_CONN'])) 
     { 
      self::$dbConn = $_SESSION['X_DB_CONN'];echo "session cache hit"; 
     } 
     else 
     { 
      $connUrl = "mysql:host=".self::$host.";dbname=".self::$db; 
      self::$dbConn = new PDO($connUrl,self::$username,self::$password,array(PDO::ATTR_PERSISTENT => true)); 
      $_SESSION['X_DB_CONN'] = self::$dbConn; 
      if(isset($_SESSION['test'])) 
      { 
       echo ":)"; 
       $_SESSION['test'] = "OO"; 
      } 

      echo "session cache NOT hit"; 
     } 
    } 
} 
도움이되지 않는 변경 다음

<?php 
    require_once 'ExceptionHandler.php'; 
    final class Database { 

    private static $db = "test"; 
    private static $host = "localhost"; 
    private static $username = "root"; 
    private static $password = ""; 

    private static $dbConn = null; 
    private static $queryCatch = array(); 
    private static function CONNECT() 
    { 
     if(self::$dbConn === null) 
     { 
      $connUrl = "mysql:host=".self::$host.";dbname=".self::$db; 
      self::$dbConn = new PDO($connUrl,self::$username,self::$password,array(PDO::ATTR_PERSISTENT => true)); 
     } 
    } 

    public static function query($sql) 
    { 
     Database::CONNECT(); 

     if(isset(self::$queryCatch[$sql]) && is_object(self::$queryCatch[$sql])) 
     { 
      $query = self::$queryCatch[$sql]; 
     } 
     else 
     { 
      $query = self::$dbConn->prepare($sql); 
      self::$queryCatch[$sql] = $query; 
     } 

     $numargs = func_num_args(); 
     $arg_list = func_get_args(); 
     //start from 1st parameter as 0th parameter is the query 
     for ($i = 1; $i < $numargs; $i++) { 

      if(is_int($arg_list[$i])) 
      { 
       $query->bindParam($i,$arg_list[$i],PDO::PARAM_INT); 
      } 
      else 
      { 
       $query->bindParam($i,$arg_list[$i],PDO::PARAM_STR); 
      } 
     } 

     $query->execute(); 

     return $query; 
    } 
} 

?> 

입니다

세션을 올바르게 시작했습니다. 내 문제를 증명하고 진술하려면 :

$ _SESSION [ 'test']은 (는) 다른 페이지에서 ":)"로 설정됩니다. :) 은이 페이지의 if 문 출력입니다. 즉이어야한다, 그래서

Beides 항상

session cache NOT hit

) 이것은 내가으로 session_start를 (포함했다

Fatal error: Exception thrown without a stack frame in Unknown on line 0

표준 PHP 오류 콘솔로 출력

표시됩니다 문제

답변

1

이런 식으로 개체, 자원 또는 처리기를 캐시 할 수 없습니다. 왜냐하면 이것은 실제 리소스가 아니라 시스템 리소스에 대한 포인터 (또는 링크)이기 때문입니다. 그래서 캐시 할 때 링크를 캐시하고 물론 새로 고침 링크가 깨지는 것입니다.

PDO::ATTR_PERSISTENT => true 정말 충분합니다.

+0

그래서 PDO가 객체를 잘못 리턴했다고 가정합니다. 핸들러 만 반환합니까? – footy

+0

Object WITH handler : – Emmerman

+0

그래서 서버/시스템에 객체가 생성 된 다음 pHp가이 객체의 포인터를 스크립트에 반환합니까? – footy

관련 문제