I have extended my Database Models from the mysqli
class, but i don't want it to reconnect everytime i instantiate a new model, because it really slows down the whole script.
I have a Database
class extends from mysqli
, and other model classes extending from Database
.
My Database
class looks like this :
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...
}
A sample model class would look like this :
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.
}
}
My question is,
How can i check if there is an active
mysqli
connection?How can i prevent it from reconnecting and use the active connection instead?
What other approaches can i follow?
Should i migrate to
PDO
, do i have to? Why?
P.S.: Migrating to PDO will be a lot of rework, as i've already built things over mysqli.
Try this one:
mysqli
connection?You can use
mysqli::ping()
method to check if the connection is alive.This is from php.net :
As the other answers say, using a persistent connection will solve your problem. Add
p:
prefix to your host name.You could consider using PDO instead, but if you don't need to support other DB types, or prepared statements mysqli looks more lightweight to me.
When connecting to the database you can put p: before the hostname to initiate a persistent connection. Like,
p:mysite.com
orp:localhost
. This may help with speed (if you are not already doing it)