Настоящее подключение в PHP: настройка соединения с MySQL через real_connect

Раздел: Взаимодействие с базами данных -> Работа с базами данных MySQL и MariaDB

Способы подключения к базам данных MySQL и MariaDB в PHP

Как выполнить простое подключение к MySQL с помощью процедурного подхода?

Функция mysqli_connect() принимает сервер, имя пользователя, пароль и имя базы данных. Этот метод подходит для быстрых скриптов без сложной конфигурации.


$connection = mysqli_connect('localhost', 'user', 'password', 'database');
if (!$connection) {
    die('Ошибка соединения: ' . mysqli_connect_error());
}
  

Real connect php (настоящее подключение в php (real_connect))

Типичные проблемы: неверные учетные данные, недоступный сервер (ошибка 2002). Решение: проверить параметры, убедиться, что сервер MySQL запущен. Функция возвращает false при неудаче, но не всегда генерирует исключение.

Цель: минимальное подключение для простых операций.

Как создать объект подключения MySQLi?

Конструктор new mysqli() позволяет сразу задать параметры. Метод connect_error проверяет ошибку.


$mysqli = new mysqli('localhost', 'user', 'password', 'database');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}
  

Ошибка Connection timed out означает неправильный хост или порт. Для длительных подключений стоит увеличить таймаут через mysqli_options() перед соединением.

Цель: объектно-ориентированный стиль, удобство для дальнейшей работы.

Как установить соединение с базой данных через PDO?

PDO предоставляет абстрактный слой для разных СУБД. Пример для MySQL:


try {
    $pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Ошибка PDO: ' . $e->getMessage());
}
  

Распространенные ошибки: драйвер PDO не установлен (класс не найден), неправильный DSN. Решение: проверить расширение php_pdo_mysql в php.ini.

Цель: переносимость между базами данных, безопасные подготовленные запросы.

Как установить соединение с дополнительными параметрами, включая SSL и таймауты, используя real_connect?

Метод real_connect() вызывается после создания объекта mysqli без базы данных. Он позволяет задать хост, пользователя, пароль, имя БД, порт, сокет и флаги. Это наиболее гибкий способ.


$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
$mysqli->ssl_set('/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca-cert.pem', NULL, NULL);
$connected = $mysqli->real_connect('localhost', 'user', 'password', 'database', 3306, NULL, MYSQLI_CLIENT_SSL);
if (!$connected) {
    die('Ошибка подключения: ' . $mysqli->connect_error);
}
  

Ошибка SSL connection error возникает при неверных сертификатах или отключенном SSL на сервере. Проверка логов сервера MySQL или SHOW VARIABLES LIKE 'have_ssl'.

Цель: тонкая настройка (таймауты, SSL, сокет, асинхронный режим).

Какое решение признано наиболее эффективным для сложных сценариев?

Использование real_connect() после mysqli_init() является предпочтительным, когда требуется полный контроль над параметрами соединения. Оно поддерживает установку множества опций через options() перед подключением: таймауты, размер пакета, кодировку, SSL, режим асинхронного запроса (флаг MYSQLI_ASYNC).


$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET NAMES 'utf8'");
if (!$mysqli->real_connect('localhost', 'user', 'password', 'database', 3306, NULL, MYSQLI_CLIENT_SSL | MYSQLI_ASYNC)) {
    die('Ошибка: ' . $mysqli->connect_error);
}
  

При асинхронном подключении необходимо проверять статус через poll(). Типичная ошибка - игнорирование проверки: соединение может быть не установлено, но метод вернет true сразу. Решение: после вызова использовать цикл с mysqli_poll().

Этот вариант обеспечивает максимальную гибкость и подходит для продакшен-среды с требованиями безопасности и производительности.

Расширенные примеры работы с real_connect

Ниже приведены подробные примеры, демонстрирующие различные аспекты использования real_connect().

Пример 1: Подключение с несколькими опциями и проверка ошибок

Пример

$mysqli = mysqli_init();
if (!$mysqli) {
    die('Не удалось инициализировать MySQLi');
}

$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
$mysqli->options(MYSQLI_OPT_READ_TIMEOUT, 30);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET SESSION sql_mode = 'STRICT_ALL_TABLES'");

if (!$mysqli->real_connect('localhost', 'admin', 'secret', 'myapp', 3306, '/var/run/mysqld/mysqld.sock', 0)) {
    echo "Код ошибки: " . $mysqli->connect_errno . "\n";
    echo "Сообщение: " . $mysqli->connect_error;
    exit;
}
echo "Подключение успешно установлено";
Код ошибки: 0
Сообщение: 
Подключение успешно установлено

В примере задается таймаут на подключение (10 сек) и на чтение (30 сек), а также устанавливается строгий режим SQL. Используется сокет Unix вместо TCP.

Пример 2: Асинхронное подключение с poll()

Пример

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
$mysqli->real_connect('localhost', 'user', 'pass', 'test', 3306, NULL, MYSQLI_ASYNC);

$links = [$mysqli];
$errors = [$mysqli];
$reject = [];

if (mysqli_poll($links, $errors, $reject, 5)) {
    foreach ($links as $link) {
        if ($link->connect_error) {
            echo "Ошибка асинхронного подключения: " . $link->connect_error;
        } else {
            echo "Подключение успешно (асинхронно)";
        }
    }
} else {
    echo "Таймаут или ошибка при асинхронном подключении";
}
Подключение успешно (асинхронно)

Асинхронный режим позволяет не блокировать скрипт при медленном соединении. После вызова real_connect() с флагом MYSQLI_ASYNC необходимо дождаться завершения через mysqli_poll().

Пример 3: SSL-подключение с проверкой сертификата

Пример

$mysqli = mysqli_init();
$mysqli->ssl_set(
    '/etc/mysql/client-key.pem',
    '/etc/mysql/client-cert.pem',
    '/etc/mysql/ca-cert.pem',
    NULL,
    NULL
);
if (!$mysqli->real_connect('db.example.com', 'ssl_user', 'ssl_pass', 'secure_db', 3306, NULL, MYSQLI_CLIENT_SSL)) {
    die('SSL ошибка: ' . $mysqli->connect_error);
}
echo "Подключение по SSL установлено";
Подключение по SSL установлено

Необходимо указать пути к файлам ключа, сертификата клиента и CA. Сервер должен поддерживать SSL. При несоответствии сертификатов возникает ошибка.

Пример 4: Динамический выбор базы данных после подключения

Пример

$mysqli = mysqli_init();
$mysqli->real_connect('localhost', 'user', 'pass', NULL, 3306, NULL, 0);
if (!$mysqli->select_db('dynamic_db')) {
    echo "Не удалось выбрать базу: " . $mysqli->error;
} else {
    echo "База данных dynamic_db выбрана";
}
База данных dynamic_db выбрана

В real_connect() поле database оставлено пустым, затем база выбирается вызовом select_db(). Это удобно, когда имя базы неизвестно заранее.

Пример 5: Обработка множественных ошибок при инициализации

Пример

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 1);

$result = @$mysqli->real_connect('192.168.1.100', 'root', 'wrong', 'test', 3306, NULL, 0);
if (!$result) {
    $errno = $mysqli->connect_errno;
    $error = $mysqli->connect_error;
    if ($errno == 1045) {
        echo "Ошибка доступа: неверное имя пользователя или пароль";
    } elseif ($errno == 2002) {
        echo "Сервер недоступен: проверьте IP и порт";
    } else {
        echo "Неизвестная ошибка ($errno): $error";
    }
}
Ошибка доступа: неверное имя пользователя или пароль

Обработка разных кодов ошибок позволяет дать пользователю понятные сообщения. Использование @ подавляет предупреждения.

Настоящее подключение в PHP (real_connect) - comments

En
Real connect php (php)