2011-04-28 162 views
0

我正在使用腳本來靜態緩存執行的DB和PDO語句。數據庫連接緩存問題

這裏是

<?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緩存

,使這個不只是靜態的,但下面改變我的連接方法是沒有幫助

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

我已經開始正確的會話。 給出證明並說明我的問題:

$ _SESSION ['test']從另一個頁面設置爲「:)」。並且 :) 是本頁中if語句的輸出。

Beides總是

session cache NOT hit

顯示

這是通過標準的PHP錯誤控制檯

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

我已經包括在session_start(輸出),使得不應該是問題

回答

1

您不能通過這種方式緩存對象,資源或處理程序。因爲這是指向系統資源的指針(或鏈接),而不是實際的資源。所以當你緩存它的時候,你會緩存鏈接,當然刷新鏈接會被破壞。

PDO::ATTR_PERSISTENT => true就足夠了。

+0

所以我的假設是一個PDO返回一個對象錯誤?它只會返回一個處理程序? – footy 2011-04-28 09:08:04

+0

對象WITH處理程序:) – Emmerman 2011-04-28 09:08:51

+0

因此,在服務器/系統中創建一個對象,然後pHp將此對象的指針返回給腳本? – footy 2011-04-28 09:14:18