我已经从mysqli
类扩展了我的数据库模型,但我不想每次实例化一个新模型时重新连接它,因为它确实会减慢整个脚本的速度。
我的Database
类扩展自mysqli
,其他模型类扩展自Database
。
我的Database
课程如下:
class Database extends mysqli {
// some properties ...
public function __construct() {
parent::__construct(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE);
$this->set_charset(MySQL_CHARACTER_SET);
// initializing stuff ..
}
// some other methods...
}
示例模型类看起来像这样:
class User extends Database {
protected $table = "users";
public function __construct($id = null) {
// Calling the parent constructor.
parent::__construct();
if($id) {
// This is the current logged-in user.
// Importing all session data into this object.
$this->data->import($this->session->all());
// ^^ This imports all the user related session data into this object
// i don't think it's relevant but i'll leave it here just in case.
}
}
我的问题是,
如何检查是否存在有效的mysqli
连接?
如何防止它重新连接并改为使用活动连接?
我可以采用哪些其他方法?
我应该迁移到PDO
,我必须这样做吗? 为什么?
P.S。:迁移到PDO会有很多返工,因为我已经在mysqli上构建了东西。
答案 0 :(得分:2)
mysqli
连接? 您可以使用mysqli::ping()
方法检查连接是否处于活动状态。
这是php.net:
if ($mysqli->ping()) {
printf ("Our connection is ok!\n");
} else {
printf ("Error: %s\n", $mysqli->error);
}
正如其他答案所说,使用持久连接可以解决您的问题。在主机名中添加p:
前缀。
parent::__construct("p:" . MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE);
您可以考虑使用PDO,但如果您不需要支持其他数据库类型,或者准备好的语句,mysqli对我来说看起来更轻量级。
答案 1 :(得分:1)
连接到数据库时,可以在主机名之前放置p:以启动持久连接。比如,p:mysite.com
或p:localhost
。这可能对速度有帮助(如果你还没有这样做)
答案 2 :(得分:1)
试试这个:
parent::__construct("p:".$host, MySQL_USER, MySQL_PASS, MySQL_DATABASE);