PHP对象之间的MySQL连接共享

时间:2012-06-29 08:48:28

标签: php mysql static database-connection

我正在尝试解决最好的问题,即程序中有多个对象连接到数据库。

我创建了一个带有静态连接var的类。这似乎意味着只打开一个连接并且所有对象共享它。

class Database {
    public static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}

普通对象版本。这会为使用它的每个对象创建一个新连接。

class Database {
    public $mysql;
    function __construct() {
        if (!isset($this->mysql)) {
            echo "Make connection\n";
            $this->mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if ($this->mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . $this->mysql->connect_error;
            }
            echo $this->mysql->host_info . "\n";
        }
    }

我想知道首选的选项是什么?我计划稍后测试性能差异。

1 个答案:

答案 0 :(得分:0)

连接到数据库是非常昂贵的操作,您应该避免创建多个连接。所以你应该放弃你的普通对象版本。

使用静态变量的选项更好,但不理想。你需要记住在每个类中复制这个构造函数。什么,如果你想改变这方面的东西?然后你需要打开所有类并在任何地方更改它。

我认为,你应该创建抽象对象Database并用你的类扩展它。

abstract class Database {
    protected static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}

然后创建将使用此连接的新对象很简单:

class ExtDatabase extends Database {
    public function __construct() {
        echo "Executing parent...";
        parent::__construct();
    }

    public function hostInfo() {
        //no problem with using connection there
        echo self::$mysql->host_info . "\n";
    }
}

但是......它也不是优秀的选择。更好的方法是使用带连接的Singleton和抽象的数据库类。