Как проверить, существует ли активное соединение MySQLi в PHP?

Я расширил мои модели баз данных из класса 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);