数据库连接缓存问题
问题描述:
我正在使用脚本来静态缓存执行的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(输出),使得不应该是问题
答
您不能通过这种方式缓存对象,资源或处理程序。因为这是指向系统资源的指针(或链接),而不是实际的资源。所以当你缓存它的时候,你会缓存链接,当然刷新链接会被破坏。
PDO::ATTR_PERSISTENT => true
就足够了。
所以我的假设是一个PDO返回一个对象错误?它只会返回一个处理程序? – footy 2011-04-28 09:08:04
对象WITH处理程序:) – Emmerman 2011-04-28 09:08:51
因此,在服务器/系统中创建一个对象,然后pHp将此对象的指针返回给脚本? – footy 2011-04-28 09:14:18