Что более эффективно и почему: одно соединение db на страницу или одно соединение db для каждой функции?

Я работаю над веб-сайтом, который очень управляется MySQL. Поэтому у меня много вопросов.

В этом разделе все рекомендуют подключиться к БД в верхней части страницы и отключиться в нижней части страницы.

Мне интересно, что более эффективно, или, вообще говоря, лучше всего: сделать одно соединение на каждой странице или подключиться по мере необходимости? (Или нет общего ответа, и это зависит?)

Кроме того, я ищу, чтобы узнать, ПОЧЕМУ это лучшая практика, с какой точки зрения вы смотрите на сценарий (например, безопасность, скорость, … Я не знаю, на что еще могут повлиять DB-соединения ?!)

Я считаю, что этот вопрос был задан раньше, но не для PHP в конкретном, и поэтому я не нашел его полезным.

Моя нынешняя практика заключалась в том, чтобы подключиться к DB на mysqli для каждой функции, которую я пишу, и отключиться в конце функции, потому что она казалась мне более чистой. Таким образом, если страница не вызывает функцию, требующую доступа к БД, никогда не будет открываться соединение. Однако может случиться так, что в зависимости от того, что пользователь делает на сайте, может быть до 10 подключений на страницу. Теперь я подумал, что это может быть справедливое распределение ресурсов. Если бы я правильно понял, всегда можно было открыть только 1 DB-соединение. Поэтому я предполагаю, что все запросы на подключение будут поставлены в очередь. Поэтому, если у пользователя есть несколько, длинных и сложных запросов, этот пользователь не будет удерживать весь трафик, потому что между каждой из запросов могут обрабатываться другие короткие запросы. Но это только я делаю вещи, я не знаю, будет ли это так работать …: D

Также я знаю, что многие разработчики здесь любят использовать PDO . Я решил использовать mysqli, когда начал развиваться, и у меня нет планов переключения. Надеюсь, мой вопрос может быть применим к обеим библиотекам.

Благодаря 🙂

Обычно подключения к базам данных очень дороги. Вот почему большинство людей рекомендуют создать соединение один раз и повторно использовать его до тех пор, пока выполнение не остановится или даже больше, если это позволит ему использовать клиентскую библиотеку базы данных.

В качестве примера PDO разрешает создание постоянных соединений, которые предположительно повышают производительность, поскольку соединение будет использоваться повторно для обслуживания нескольких запросов в строке. Из http://php.net/manual/en/pdo.connections.php :

Многие веб-приложения получат преимущества от постоянных подключений к серверам баз данных. Стойкие соединения не закрываются в конце скрипта, но кэшируются и повторно используются, когда другой скрипт запрашивает соединение с использованием тех же учетных данных. Постоянный кеш подключений позволяет избежать накладных расходов на установление нового соединения каждый раз, когда скрипт должен разговаривать с базой данных, что приводит к более быстрому веб-приложению.

Я бы предложил вам использовать шаблон фабрики соединений. Это позволит вам только вызывать фабрику в тех функциях, которые ей нужны (избегая накладных расходов на соединение, если соединение никогда не требуется), позволяя вам повторно использовать соединение, если вы ранее подключили (избегая накладных расходов на многократное создание и деконструирование соединений).

Возможно, connectionFactory.php включен в ваши страницы или доступен через ваш загрузчик, как это.

class ConnectionFactory{ private static $factory; public static function getFactory(){ if (!self::$factory){ self::$factory = new ConnectionFactory(); $this->db = null; } return self::$factory; } private $db; public function getConnection(){ if (is_null($this->db)) $this->db = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if ($this->db->connect_error){ throw new Exception("Connect Error (" . $this->db->connect_errno . ") " . $this->db->connect_error ); } return $this->db; } public function closeConnection(){ if (! is_null($this->db)){ $this->db::close(); $this->db = null; } } 

}

Затем вы можете использовать его позже в функции:

 function doStuff(){ try{ $conn = ConnectionFactory::getFactory()->getConnection(); }catch (Exception $e){ } 

}

Это гарантирует, что вы не нанесете накладных расходов, если вы вообще не используете соединение, и если вы это сделаете, вы можете использовать соединение.

devzone.zend.com говорит: «Открытые соединения (и подобные ресурсы) автоматически уничтожаются в конце выполнения скрипта».

Поэтому вам не нужно явно закрывать соединение. Однако есть моменты, когда это желательно сделать по соображениям производительности. Это будет зависеть от контекста, в котором вы работаете, и вам придется балансировать это самостоятельно, когда вы смотрите на контекст.

Вы также можете посмотреть аналогичное подключение к базе данных Global или Singleton для подключения к базе данных?

ПРИМЕЧАНИЕ. Я не тестировал ни один из этих кодов, это должен быть, возможно, рабочий пример. 😉

одно соединение db на страницу или одно соединение db для каждой функции?

по одной на страницу

ПОЧЕМУ это лучшая практика,

скорость и здравый смысл

Если бы я правильно понял, всегда можно было открыть только 1 DB-соединение.

Неправильно. Единственный предел может быть установлен на стороне БД. И всегда есть пул.

Сделать одно соединение на каждую страницу или подключиться по мере необходимости?

Что мешает вам подключиться один раз, но только при необходимости ? Сделайте свою функцию db автосоединением, если нет открытого соединения и повторного использования, если существует. Хотя я не считаю, что это бесполезно для сайта «очень MySQL DB driven».