我一直在使用
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中使用单例被认为是不好的做法.根据我的经验,最棘手的问题是单元测试.在测试单例时,很难确保两个测试是独立的.
原文链接:https://www.f2er.com/php/240328.html我将约束的责任委托给创建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"); }