real_connect
В этой статье рассматривается функция mysqli_real_connect() в PHP, используемая для установки соединения с базой данных MySQL.
В этой статье мы рассмотрим метод real_connect() в PHP, который используется для установки соединения с базой данных MySQL. (Процедурный эквивалент — mysqli_real_connect().)
На этой странице описано, чем real_connect() отличается от обычного mysqli_connect(), приведён полный список параметров, объяснено, как включить SSL и другие флаги соединения, а также описаны наиболее распространённые ошибки.
Что такое real_connect() и зачем его использовать?
Метод real_connect() открывает соединение с MySQL-сервером, как и mysqli_connect(). Ключевое отличие состоит в том, что real_connect() работает с дескриптором соединения, который вы уже создали с помощью mysqli_init(), вместо того чтобы создавать соединение и подключаться в одном шаге.
Этот дополнительный шаг важен: он даёт вам окно между созданием дескриптора и установкой соединения, в котором можно настроить параметры, которые можно задать только до подключения. Используйте real_connect() (вместо mysqli_connect()), когда вам нужно:
- Установить параметры соединения с помощью
mysqli_options()— например, тайм-аут подключения (MYSQLI_OPT_CONNECT_TIMEOUT) или поддержку локальных файлов. - Включить SSL/TLS-соединение с помощью
ssl_set()и флагаMYSQLI_CLIENT_SSL. - Передать клиентские флаги, такие как
MYSQLI_CLIENT_COMPRESSилиMYSQLI_CLIENT_FOUND_ROWS. - Открыть постоянное соединение, добавив к хосту префикс
p:.
Если ни одно из этих требований не нужно, вполне подойдёт более простой mysqli_connect().
Базовое использование
real_connect() всегда следует двухэтапной схеме: сначала создаётся дескриптор, затем устанавливается соединение. Вот объектно-ориентированный подход:
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>Сначала мы создаём дескриптор MySQLi с помощью mysqli_init() и проверяем успешность операции. Затем вызываем real_connect() на объекте $mysqli для подключения. В случае сбоя выводим ошибку с помощью connect_errno и connect_error и прекращаем выполнение; при успехе выводим информацию о хосте и в конце освобождаем соединение с помощью close().
Параметры
real_connect() принимает следующие параметры, все необязательные, в таком порядке:
| Параметр | Описание | По умолчанию |
|---|---|---|
host | Имя хоста или IP-адрес. Добавьте префикс p: для постоянного соединения. | localhost (или значение из ini) |
username | Имя пользователя MySQL. | текущий пользователь |
password | Пароль пользователя. | "" |
database | База данных по умолчанию, выбираемая при подключении. | "" |
port | Номер TCP-порта. | 3306 |
socket | Unix-сокет или именованный канал Windows. | из ini |
flags | Битовая маска клиентских флагов (см. ниже). | 0 |
Примечание: при использовании объектно-ориентированного API дескриптором является сам объект, поэтому первый аргумент — это
host. В процедурном вариантеmysqli_real_connect($link, $host, ...)первым передаётся ссылка.
Установка параметров перед подключением
Именно для этого и существует real_connect(). Настройте дескриптор с помощью mysqli_options() между init и real_connect:
<?php
$mysqli = mysqli_init();
// These can only be set before connecting:
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET autocommit = 0");
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Connected with a 5-second timeout.';
$mysqli->close();
?>Подключение с SSL и клиентскими флагами
Седьмой параметр — это битовая маска клиентских флагов. Чтобы требовать зашифрованное соединение, настройте сертификаты с помощью ssl_set() и передайте MYSQLI_CLIENT_SSL:
<?php
$mysqli = mysqli_init();
$mysqli->ssl_set(null, null, '/path/to/ca-cert.pem', null, null);
$mysqli->real_connect(
'db.example.com', 'username', 'password', 'database',
3306, null,
MYSQLI_CLIENT_SSL
);
echo 'Encrypted connection established.';
$mysqli->close();
?>Распространённые флаги, которые можно комбинировать с помощью |:
MYSQLI_CLIENT_SSL— использовать шифрование SSL/TLS.MYSQLI_CLIENT_COMPRESS— использовать сжатый протокол.MYSQLI_CLIENT_FOUND_ROWS— возвращать количество найденных строк вместо изменённых.
Постоянные соединения
Добавление префикса p: к имени хоста повторно использует существующее соединение из пула между запросами вместо открытия нового, что снижает накладные расходы на подключение на нагруженных серверах:
<?php
$mysqli = mysqli_init();
$mysqli->real_connect('p:localhost', 'username', 'password', 'database');
?>Распространённые ошибки
- Забыть вызвать
mysqli_init().real_connect()должен вызываться на дескрипторе, возвращённомmysqli_init(). Вызов его на только что созданном объектеnew mysqli(), который уже подключён, завершится ошибкой. - Проверка неправильного свойства ошибки. До установки соединения используйте
connect_errno/connect_error, а неerrno/error. - Установка параметров слишком поздно. Параметры, такие как тайм-аут соединения, не имеют эффекта после открытия соединения — они должны быть установлены до
real_connect().
Заключение
Метод real_connect() устанавливает соединение с MySQL из дескриптора, созданного с помощью mysqli_init(), давая возможность настроить тайм-ауты, SSL и клиентские флаги, которые нельзя задать с помощью одношагового mysqli_connect(). После подключения можно выполнять запросы с помощью query() и выбирать базу данных с помощью select_db().