加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

PHP单例数据库连接模式

发布时间:2020-05-25 09:09:42 所属栏目:PHP 来源:互联网
导读:我一直在使用 PHP和MySQL开展一个小项目.我已经阅读了很多关于管理连接的最佳实践等等. 我还实现了(在一些帖子后面发现)一个单例类来管理MySQL连接. require_once config.inc.php;class DbConn { private static $instance; private $dbConn; private functio

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

我还实现了(在一些帖子后面发现)一个单例类来管理MySQL连接.

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访问者,而且每次我的单身对象都会打电话,我是否应该有性能问题?我的意思是,我不应该有一种连接池而不是单身人士吗?

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

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

另外对我而言,与其他语言相比,您似乎不了解Singletons如何在PHP中工作.例如,如果你有10.000个并发请求,那么每个请求都在一个单独的PHP进程或线程中运行,这意味着它们都将拥有自己的“singleton”实例.

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

但是,仅仅为了理论,PHP中的单例必须意识到有人可以使用克隆这一事实.在你的情况下意味着可以这样做:

$db = DB::getInstance();
$db2 = clone $db;

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

public function __clone() {
    throw new Exception("Can't clone a singleton");
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读