2011-04-28 168 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