Проблема с кэшированием соединения с базой данных

#php #database #caching #session-variables

#php #База данных #кэширование #сессия-переменные

Вопрос:

Я использую скрипт для статического кэширования выполняемых инструкций 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]) amp;amp; 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’] установлено с другой страницы на «:)». And 🙂 — это вывод из инструкции if на этой странице.

Всегда работает

кэш сеанса НЕ удален

отображается

Это вывод стандартной консоли ошибок php

Неустранимая ошибка: исключение, созданное без фрейма стека в Unknown в строке 0

Я включил session_start (), так что это не должно быть проблемой

Ответ №1:

Вы не можете кэшировать объекты, ресурсы или обработчики таким способом. Потому что это указатель (или ссылка) на системный ресурс, а не фактический ресурс. Поэтому, когда вы кэшируете это, вы кэшируете ссылку, и, конечно, после обновления ссылка будет разорвана.

PDO::ATTR_PERSISTENT => true было бы действительно достаточно.

Комментарии:

1. итак, мое предположение о том, что PDO возвращает объект, неверно? и это возвращает только обработчик?

2. Итак, на сервере / системе создается объект, а затем pHp возвращает указатель этого объекта скрипту?