W3docs

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
socketUnix-сокет или именованный канал 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().

Практика

Практика
Что делает функция mysqli_real_connect() в PHP?
Что делает функция mysqli_real_connect() в PHP?
Was this page helpful?