#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 возвращает указатель этого объекта скрипту?