Подключения и управление подключениями
Для установки соединений создают экземпляры базового класса PDO.
Неважно, какой драйвер хотелось использовать;
всё равно будет использовано имя класса PDO. Конструктор класса принимает
параметры для задания источника базы данных (DSN), а также необязательные
имя пользователя и пароль (если есть).
Пример #1 Подключение к MySQL
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
Если при подключении произошла ошибка, будет выброшено исключение
PDOException
. Его можно перехватить и обработать, либо
оставить на откуп глобальному обработчику ошибок, который задан
функцией set_exception_handler().
Пример #2 Обработка ошибок подключения
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
// Например, через какое-то время повторить попытку соединения
}
?>
Внимание
Как и остальные исключения,
исключение PDOException можно отловить явно — через
блок catch
или неявно — через функцию set_exception_handler().
По умолчанию же непойманное исключение будет преобразовано в фатальную ошибку уровня
E_FATAL_ERROR
.
Фатальня ошибка будет содержать стек вызовов, появляется риск утечки информации о соединении.
Поэтому на сервере, который работает в производственной среде, в файле php.ini для опции
display_errors
должо быть установлено значение 0
.
При успешном подключении к базе данных в скрипт будет возвращён созданный
объект PDO. Соединение остаётся активным в течение жизни
объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления
всех ссылок на него (этого можно добиться, присваивая null
всем переменным,
указывающим на объект). Если не сделать этого явно, PHP автоматически
закроет соединение по окончании работы скрипта.
Замечание:
Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement
или другие переменные, ссылающиеся на него), они также должны быть удалены
(например, присвоением null
переменной, ссылающейся на PDOStatement).
Пример #3 Закрытие соединения
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// здесь мы каким-то образом используем соединение
$sth = $dbh->query('SELECT * FROM foo');
// соединение больше не нужно, закрываем
$sth = null;
$dbh = null;
?>
Во многих приложениях может оказаться полезным использование постоянных
соединений к базам данных. Постоянные соединения не закрываются при
завершении работы скрипта, они кешируются и используются повторно,
когда другой скрипт запрашивает соединение с теми же учётными данными.
Постоянные соединения позволяют избежать создания новых подключений каждый
раз, когда требуется обмен данными с базой, что в результате даёт прирост
скорости работы таких приложений.
Пример #4 Постоянные соединения
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
Значение параметра PDO::ATTR_PERSISTENT
преобразовывается
в логическое значение (bool) (включить/отключить постоянные подключения),
если это не числовая строка (string), которая в этом случае позволяет использовать несколько пулов постоянных подключений.
Это полезно, если разные соединения используют несовместимые настройки,
например, разные значения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
.
Замечание:
Чтобы использовать постоянные соединения, необходимо добавить константу
PDO::ATTR_PERSISTENT
в массив параметров драйвера,
который передаётся конструктору PDO. Если просто задать этот атрибут
функцией PDO::setAttribute() уже после создания объекта,
драйвер не будет использовать постоянные соединения.
Замечание:
Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают
объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows
точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных
соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям
текущего процесса; если PDO сам кеширует соединение, то это соединение
будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль
будет создавать дополнительные подключения для своих нужд.