是什么影响MySQL中的max_connections_per_hour值?

时间:2014-10-25 11:05:05

标签: php mysql pdo

我一直在为我的网站编写一个CMS,我在Awardspace上托管它,其空间限制为max_connections_per_hour 1500。所以,我自然认为这是您对数据库建立的连接数。我在PHP文件的开头创建了一个新的PDO对象,并在最后关闭它。所以我每页只做一次连接。但是,我仍然保持超过max_connections_per_hour值。 这令我感到困惑,因为我无法在一小时内加载超过1500页。

但是,我确实每页进行22次查询。那么也许这会影响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();

在底部。

要执行查询,我在其间使用适当的函数。

1 个答案:

答案 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);