首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP单例数据库连接模式

问PHP单例数据库连接模式
EN

Stack Overflow用户
提问于 2014-02-17 23:20:52
回答 1查看 31.8K关注 0票数 10

我一直在做一个使用PHP和MySQL的小项目。我已经阅读了很多关于管理连接等方面的最佳实践。

我还实现了一个单例类来管理MySQL连接。

代码语言:javascript
复制
require_once 'config.inc.php';
class DbConn {

    private static $instance;
    private $dbConn;

    private function __construct() {}

    /**
     *
     * @return DbConn
     */
    private static function getInstance(){
        if (self::$instance == null){
            $className = __CLASS__;
            self::$instance = new $className;
        }

        return self::$instance;
    }

    /**
     *
     * @return DbConn
     */
    private static function initConnection(){
        $db = self::getInstance();
        $connConf = getConfigData();
        $db->dbConn = new mysqli($connConf['db_host'], $connConf['db_user'], $connConf['db_pwd'],$connConf['db_name']);
        $db->dbConn->set_charset('utf8');
        return $db;
    }

    /**
     * @return mysqli
     */
    public static function getDbConn() {
        try {
            $db = self::initConnection();
            return $db->dbConn;
        } catch (Exception $ex) {
            echo "I was unable to open a connection to the database. " . $ex->getMessage();
            return null;
        }
    }
}

但是..。如果我的网站同时有10K访问者,并且我每次调用我的单例对象时,我应该预期会有性能问题吗?我的意思是,我不应该有一个连接池而不是一个单例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-17 23:26:23

在PHP中使用singletons被认为是不好的做法。根据我的经验,它们最大的问题是单元测试。在测试单例时,很难确保两个测试是独立的。

我会将约束“只有一个实例应该存在”的责任委托给创建Db对象的代码。

另外,对我来说,在PHP中单例的工作方式与其他语言相比似乎存在误解:例如,如果你有10.000个并发请求,那么每个请求都运行在单独的PHP进程或线程中,这意味着它们都将有自己的“单例”实例,只有单个请求才能共享这个对象(当在常见的web后端场景中运行PHP时)。

在PHP中没有“连接池”,但是你可以在mysql中使用mysqli持久连接。这可以通过在创建mysqli时在主机名前面传递p:来实现。这在这里可能有帮助,但要小心处理(meaning read the documentation first)

然而,仅从理论上讲,PHP中的单例必须意识到有人可以使用clone。这意味着在您的情况下,可以这样做:

代码语言:javascript
复制
$db = DB::getInstance();
$db2 = clone $db; 

为了避免这种情况,您可以像这样实现__clone()方法:

代码语言:javascript
复制
public function __clone() {
    throw new Exception("Can't clone a singleton");
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21832809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档