2017-05-21 3 views
0

私のサイトでは、すべてのユーザーがデータベースを操作します(いくつかの情報を追加して取得し、変更します)。サーバーには、dbユーザーあたり30同時接続に制限があります。mysql接続数を減らす方法は?

設定を変更できません。

オンラインユーザー数が850〜950を超えると、db(php + mysqli)に接続するとエラーが返されます。私はデータベース用のユーザーをさらに増やそうとしましたが、ホスティングスタッフはそれらをすべて削除しました。

どのように接続数を減らすことができますか?サーバへの定期的な要求の

削減周波数(、新しいメッセージを取得ドラフトのようなテキストを()の保存を):私はすでにやった

ユーザーが何かをしたときに最後に保存するようなクエリが削除されました。

統計を保存するの削減周波数など

答えて

0

この(そのシングルトンパターンと呼ばれる)を使用してください:クエリを実行するには

class Database { 
    private $_connection; 
    private static $_instance; //The single instance 
    private $_host; 
    private $_username; 
    private $_password; 
    private $_database; 

    /* 
    Get an instance of the Database 
    @return Instance 
    */ 
    public static function getInstance() { 
     if (!self::$_instance) { // If no instance then make one 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    // Constructor 
    private function __construct() 
    { 
     $this->setHost('localhost'); 
     $this->setUsername('root'); 
     $this->setPassword(''); 
     $this->setDatabase('testbd'); 

     $this->_connection = new mysqli($this->_host, $this->_username, $this->_password, $this->_database); 

     // Error handling 
     if (mysqli_connect_error()) { 
      trigger_error("Failed to connect to MySQL: " . mysqli_connect_error(), 
      E_USER_ERROR); 
     } 
    } 

    // Magic method clone is empty to prevent duplication of connection 
    private function __clone() { } 

    // Get mysqli connection 
    public function getConnection() { 
     return $this->_connection; 
    } 

    /** 
    * @param string $host 
    */ 
    public function setHost($host) { 
     $this->_host = $host; 
    } 

    /** 
    * @param string $username 
    */ 
    public function setUsername($username) { 
     $this->_username = $username; 
    } 

    /** 
    * @param string $password 
    */ 
    public function setPassword($password) { 
     $this->_password = $password; 
    } 

    /** 
    * @param string $database 
    */ 
    public function setDatabase($database) { 
     $this->_database = $database; 
    } 
} 

class Query extends Database { 
    public static function run($sql) { 
     return parent::getInstance()->getConnection()->query($sql); 
    } 

    public static function escape($string) { 
     return parent::getInstance()->getConnection()->real_escape_string($string); 
    } 

    public static function error() { 
     return parent::getInstance()->getConnection()->error; 
    } 
} 

を、それはmysqliの結果オブジェクトを返しますQuery::run($sql);を呼び出します。

+0

私がそれを理解していれば、このパターンは1つのプロセスで2つの接続(またはそれ以上)がないことを保証するために使用されましたか?この問題はありません。スクリプトの最初の行にmysqliオブジェクトを1つ作成し、どこでも使用できます。 – Alexey

+0

ユーザーは、dbに接続するスクリプトにアクセスするたびに、自動的に新しい接続を作成します。このパターンは、サーバーがユーザーに対して1つの接続を作成することを保証します。 – styl3r

関連する問題