开发者

Database connection caching problem

开发者 https://www.devze.com 2023-03-01 01:31 出处:网络
I am using a script to cache statically DB and PDO statements executed. here it is <?php require_once \'ExceptionHandler.php\';

I am using a script to cache statically DB and PDO statements executed.

here it is

    <?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($开发者_StackOverflow社区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;
    }
}

?>

I wanted to make this not just statically in page caching but a global $_SESSION caching

But the following changed to my connect method is not helping

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

I have started the session properly. To Give proof and stating my problem:

The $_SESSION['test'] is set from another page to ":)". And :) is the output from the if statement on this page.

Beides always

session cache NOT hit

is displayed

This is the output by the standard php error console

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

I have included the session_start() so that shouldn't be the problem


You can't cache objects, resourses or handlers this way. Because this is pointer (or link) to the system resource, not an actual resource. So when when you cache it, you cache link, and of course after refresh link will be broken.

PDO::ATTR_PERSISTENT => true would be really enough.

0

精彩评论

暂无评论...
验证码 换一张
取 消