Я работаю над веб-сайтом, который очень управляется 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».