打开MySQL连接太多

时间:2011-11-10 20:45:31

标签: php mysql

我正在开发一个项目,其中网页的两个部分经常更改并获取最近的数据。我对是否使用mysql_connectmysql_pconnect感到困惑?我有一个配置文件,包含在每个页面中。我使用一个数据库连接对象进行查询。即使大约70个用户在线,它在我的服务器上显示20,000个连接。请建议我保持单个用户保持单个连接的最佳方式,因此当有70个在线用户时应该有70个连接。目前我没有使用mysql_close方法来关闭连接。这是它显示这些连接的原因吗?你的建议真的很感激。

3 个答案:

答案 0 :(得分:2)

在这种情况下使用的常见模式是单例模式,这里是一些粗略的代码。

class DB_Instance
{
    private static $db;

    public static function getDB()
    {
        if (!self::$db)
                self::$db = new Database(); 

        return self::$db;
    }
}


function getSomething()
{
    $conn = DB_Instance::getDB();
    .
    .
    .
}

一些示例/参考

http://tutorialpedia.org/tutorials/Singleton+pattern+in+PHP.html http://www.ricocheting.com/static/code/php/mysql-v3/Database.singleton.phps http://netlinxinc.com/netlinx-blog/53-php/7-applying-the-singleton-pattern-to-database-connections-in-php.html

答案 1 :(得分:0)

在这里你有我的实现可能对你有用

<?php
    class Utils_Sql{
        private $count = 0;
        private static $sqlObj = null;
        /** 
         * @return Utils_Sql 
         */
        public static function getSql(){
            if(self::$sqlObj===null){self::$sqlObj = new Utils_Sql();}
            return self::$sqlObj;
        }
        private $db;
        private function __construct(){
            $this->db = mysql_connect(MYSQL_SERVER,DB_LOGIN,DB_PASS);
            if($this->db === false){
                Utils_Logging_Logger::getLogger()->log(
                    array("Unable to connect to DB on Mysql_Server:".MYSQL_SERVER." with login:".DB_LOGIN." and pass:".DB_PASS."!")
                    ,Utils_Logging_Logger::TYPE_ERROR
                 );
            }else{
                if (!mysql_select_db ( DB_NAME , $this->db )) {
                    $sql = "CREATE DATABASE " . DB_NAME;
                    $this->qry($sql);
                    if (!mysql_select_db ( DB_NAME , $this->db )) {
                        Utils_Logging_Logger::getLogger()->log(
                            array("DB: ".DB_NAME." not found"),
                            Utils_Logging_Logger::TYPE_ERROR
                        );
                    }
                }
            }
        mysql_set_charset  ('utf8',$this->getConnection());     
        }    
        public function getConnection(){return $this->db;}
        public function qry($sql,$errType,$errMsg=""){
            $this->count++;
    //      Utils_Logging_Logger::getLogger()->log("<br>$sql<br>",Utils_Logging_Logger::TYPE_LOG);
            $ret = mysql_query($sql,$this->getConnection());
            if(mysql_error($this->getConnection())){
                //Error
                $msgs = array(
                    "mysql_error: (".mysql_error($this->getConnection()).")",
                    "qry: \"$sql\""
                );
                if($errMsg!==""){$msgs[]="$errMsg";}
                Utils_Logging_Logger::getLogger()->log($msgs,$errType);
            }
            return $ret;
        }
        public function getData($sql,$errType=Utils_Logging_Logger::TYPE_ERROR){
            $r = $this->qry($sql,$errType);
            if($r === false){
                Utils_Logging_Logger::getLogger()->log("No Sql Resource, Illegal Query!",$errType);
                return false;
            }
            $ret = array();
            while(($data = mysql_fetch_assoc($r))!==false){
                $ret[] = $data;
            }
            if(count($ret)===1){return $ret[0];}
            else if(count($ret)>1){return $ret;}
            else{
                $msgs = array(
                    "No resulset found.",
                    "qry: \"$sql\""
                );
                Utils_Logging_Logger::getLogger()->log($msgs,$errType|Utils_Logging_Logger::TYPE_WARNING);
                return false;
            }
        }
        public function getInsertId($sql,$errType=Utils_Logging_Logger::TYPE_ERROR){
            $this->qry($sql,$errType);
            $ret = mysql_insert_id($this->getConnection());
            if(!is_numeric($ret)){Utils_Logging_Logger::getLogger()->log("mysql_insert_id is not numeric!",$errType);}
            return $ret;
        }
        public function getDbName(){return DB_NAME;}
        public function __destruct(){
    //        Utils_Logging_Logger::getLogger()->log("Querys count: '$this->count'",Utils_Logging_Logger::TYPE_LOG);
        }
    }

答案 2 :(得分:0)

Interstellar_Coder是正确的,您希望使用单例/工厂解决方案进行数据库连接处理。我们在这里工作,它很好地为我们服务。

虽然Interstallar_Coder的解决方案有效,但我为另一个post编写了一个更灵活的解决方案。

销毁数据库连接:

public function __destruct()
{
    foreach (self::$dbos as $key => $dbo) {
        self::$dbos[$key] = null;
    }
}

有关PDO connection management的更多信息。