Я расширил мои модели баз данных из класса 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
, мне нужно? Зачем?
PS: Миграция в PDO будет много переделана, поскольку я уже создал вещи поверх mysqli.
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 выглядит более легким для меня.
При подключении к базе данных вы можете поставить p: перед именем хоста, чтобы инициировать постоянное соединение. Например, p:mysite.com
или p:localhost
. Это может помочь со скоростью (если вы еще этого не сделали)
Попробуй это:
parent::__construct("p:".$host, MySQL_USER, MySQL_PASS, MySQL_DATABASE);