Должен ли я продолжать переподключение к mysql в PHP?

У меня довольно большой сайт, и каждая страница построена из нескольких включенных файлов, мой сайт на 100% в процедурном формате, и я пытаюсь научиться использовать классы и более подход ООП в PHP.

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

Теперь, когда я пытаюсь преобразовать в OO-путь, я начинаю писать класс mysql для подключения и запуска запросов, поэтому я думаю об использовании функций __construct для соединения с mysql, мне просто интересно, как это будет работать, хотя каждый раз, когда этот класс будет вызван, он сделает или попытается установить соединение с mysql вместо одного раза.

Может быть, я не понимаю этого ясно. Должен ли я просто инициировать этот класс в заголовке 1 раз, и тогда мне больше не придется беспокоиться?

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

Или вы можете создавать новые объекты своего класса MySQL везде. mysql_connect не открывает новые соединения, если один из них открыт:

Если второй вызов выполняется с mysql_connect () с теми же аргументами, новая связь не будет установлена, но вместо этого будет возвращен идентификатор ссылки уже открывшейся ссылки.

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

Вот мой пример:

class db { public $host; public $user; public $pass; public $database; private static $instance = false; private function __construct() { } public static function getInstance() { if (self::$instance === false) { self::$instance = new db; } return self::$instance; } public function db_connect() { } public function db_disconnect() { } } 

Таким образом, всякий раз, когда вы вызываете: db :: getInstance () -> db_connect (), вы уверены, что везде будет только один экземпляр этого соединения.

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

Конечно, неплохо было бы написать свои собственные занятия в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управления подключением к базе данных (Zend_Db и т. Д.).

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

У меня есть пример кода обработчика базы данных для вас, например, его PHP 5 и использует PDO.

 <?php // Class providing generic data access functionality class DatabaseHandler { // Hold an instance of the PDO class private static $_mHandler; // Private constructor to prevent direct creation of object private function __construct() { } // Return an initialized database handler private static function GetHandler() { // Create a database connection only if one doesn't already exist if (!isset(self::$_mHandler)) { // Execute code catching potential exceptions try { // Create a new PDO class instance self::$_mHandler = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); // Configure PDO to throw exceptions self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$_mHandler->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); } catch (PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } } // Return the database handler return self::$_mHandler; } // Clear the PDO class instance public static function Close() { self::$_mHandler = null; } // Wrapper method for PDO::prepare private static function Prepare($queryString) { // Execute code catching potential exceptions try { // Get the database handler and prepare the query $database_handler = self::GetHandler(); $statement_handler = $database_handler->prepare($queryString); // Return the prepared statement return $statement_handler; } catch (PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } } // Wrapper method for PDOStatement::execute() public static function Execute($sqlQuery, $params = null) { // Try to execute an SQL query or a stored procedure try { $statement_handler = self::Prepare($sqlQuery); // Execute query $statement_handler->execute($params); } // Trigger an error if an exception was thrown when executing the SQL query catch(PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } } // Wrapper method for PDOStatement::fetchAll() public static function GetAll($sqlQuery, $params = null, $fetchStyle = PDO::FETCH_ASSOC) { // Initialize the return value to null $result = null; // Try to execute an SQL query or a stored procedure try { $statement_handler = self::Prepare($sqlQuery); // Execute the query $statement_handler->execute($params); // Fetch result $result = $statement_handler->fetchAll($fetchStyle); } // Trigger an error if an exception was thrown when executing the SQL query catch(PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } // Return the query results return $result; } // Wrapper method for PDOStatement::fetch() public static function GetRow($sqlQuery, $params = null, $fetchStyle = PDO::FETCH_ASSOC) { // Initialize the return value to null $result = null; // Try to execute an SQL query or a stored procedure try { $statement_handler = self::Prepare($sqlQuery); // Execute the query $statement_handler->execute($params); // Fetch result $result = $statement_handler->fetch($fetchStyle); } // Trigger an error if an exception was thrown when executing the SQL query catch(PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } // Return the query results return $result; } // Return the first column value from a row public static function GetOne($sqlQuery, $params = null) { // Initialize the return value to null $result = null; // Try to execute an SQL query or a stored procedure try { $statement_handler = self::Prepare($sqlQuery); // Execute the query $statement_handler->execute($params); // Fetch result $result = $statement_handler->fetch(PDO::FETCH_NUM); /* Save the first value of the result set (first column of the first row) to $result */ $result = $result[0]; } // Trigger an error if an exception was thrown when executing the SQL query catch(PDOException $e) { // Close the database handler and trigger an error self::Close(); trigger_error($e->getMessage(), E_USER_ERROR); } // Return the query results return $result; } } ?> 

Вы должны передать объект соединения (возможно, PDO) вокруг, и различные места должны быть в состоянии выбрать это, либо как параметр, либо как свойство некоторого центрального объекта, к которому другие ссылаются, или что-то в этом роде.

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

Вы можете использовать этот метод, если вы используете функцию mysql_pconnect (), которая будет искать, если есть уже соединение mysql, и в случае его обнаружения оно не создаст другого.

В альтернативном случае, если вы считаете или не используете экземпляры в php, вы можете напрямую вызвать объект базы данных php, например:

 class DB {} DB::connect($host, $user, $pass); 

Если вы используете этот метод, вам не нужно беспокоиться о нескольких подключениях. Конечно, если вам нужно использовать несколько подключений одновременно к нескольким базам данных, вы можете использовать экземпляры объектов или создать свой класс, чтобы он мог принимать несколько параметров и хранить их сразу (не очень рекомендуя это)