数据库连接缓存问题

时间:2011-04-28 08:34:06

标签: php database caching session-variables

我正在使用脚本来静态缓存执行的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 [&#39; test&#39;]从另一个页面设置为&#34;:)&#34;。和 :) 是此页面上if语句的输出。

Beides总是

  

会话缓存未命中

显示

这是标准php错误控制台的输出

  

致命错误:没有抛出异常   第0行的未知中的堆栈帧

我已经包含了session_start(),因此不应该是问题

1 个答案:

答案 0 :(得分:1)

您不能以这种方式缓存对象,资源或处理程序。因为这是指向系统资源的指针(或链接),而不是实际资源。因此,当您缓存它时,您将缓存链接,当然,刷新链接将被破坏。

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