我一直在为我的网站编写一个CMS,我在Awardspace上托管它,其空间限制为max_connections_per_hour
1500。所以,我自然认为这是您对数据库建立的连接数。我在PHP文件的开头创建了一个新的PDO对象,并在最后关闭它。所以我每页只做一次连接。但是,我仍然保持超过max_connections_per_hour
值。
这令我感到困惑,因为我无法在一小时内加载超过1500页。
max_connections_per_hour
值?即使在那时,我仍然认为我超过1500是很奇怪的。
我可以执行任何MySQL命令,显示我这小时已经建立的连接数量吗?我已经了解SHOW GLOBAL STATUS
,但限制是基于每个用户,所以如果我使用SHOW GLOBAL STATUS
,它会显示所有用户的连接。
有没有人解释为什么会发生这种情况?
提前致谢!
编辑:我的数据库类:
require_once(__DIR__ . '/configuration.php');
class Database {
private $dbh;
public $queryCount = 0;
function __construct() {
try {
$this->dbh = new PDO('mysql:host=' . DATABASE_HOST . ';dbname=' . DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD);
} catch(PDOException $e) {
die($e->getMessage());
}
}
function executeQuery($query, $parameters = array()) {
try {
$statement = $this->dbh->prepare($query);
$statement->execute($parameters);
$statement->setFetchMode(PDO::FETCH_ASSOC);
$result = $statement->fetchAll();
$this->queryCount += 1;
return $result;
} catch(Exception $e) {
die($e->getMessage());
}
}
function close() {
$this->dbh = NULL;
}
}
我用:
$database = new Database();
位于页面顶部,
$database->close();
在底部。
要执行查询,我在其间使用适当的函数。
答案 0 :(得分:1)
打开连接是一项昂贵的操作,您要在每个页面上打开一个连接,因为您需要关闭它。
在创建新连接之前,您应该首先检查连接是否为空。
而且你也不应该手动关闭它。
创建连接时尝试使用单例方法:
<强> Conn.php 强>
<?php
require_once(__DIR__ . '/configuration.php');
class Conn{
protected static $db;
private function __construct() {
try {
self::$db = new PDO(
'mysql:host=' . DATABASE_HOST . ';dbname=' . DATABASE_NAME,
DATABASE_USERNAME,
DATABASE_PASSWORD,
array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)
);
self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch (PDOException $e) {
die($e->getMessage());
}
}
public static function getConnection() {
if (!self::$db) {
new Conn();
}
return self::$db;
}
}
?>
<强> database.php中强>
<?php
require_once('Conn.php');
class Database{
static $dbh;
static $queryCount = 0;
public function __construct() {
self::$dbh = Conn::getConnection();
var_dump(self::$dbh);
}
public static function executeQuery($query, $parameters = array()) {
try {
$statement = self::$dbh->prepare($query);
$statement->execute($parameters);
$statement->setFetchMode(PDO::FETCH_ASSOC);
$result = $statement->fetchAll();
self::$queryCount += 1;
return $result;
} catch(Exception $e) {
die($e->getMessage());
}
}
}
<强>用法:强>
include 'Database.php';
$db = new Database();
$data = $db->executeQuery('SELECT * FROM example ');
var_dump($data);