Хост PHP MySQL: варианты настройки серверного окружения
Обзор настройки хоста для подключения PHP к MySQL
Какое соединение с MySQL является наиболее производительным для локального сервера?
Для локального сервера оптимально использовать Unix-сокет, который позволяет избежать накладных расходов TCP/IP. В PHP настройка выполняется через PDO или mysqli. Пример:
<?php
$dsn = 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Соединение установлено через сокет.';
?>Php mysql localhost (php mysql localhost)
Пояснение: путь к сокету зависит от системы. Его можно узнать через команду mysql_config --socket или в выводе phpinfo() в разделе mysql.default_socket.
Типичная ошибка:
PDO::__construct(): SQLSTATE[HY000] [2002] No such file or directory - означает, что сокет не найден. Решение: следует проверить путь и права доступа. Пользователь веб-сервера (www-data, apache, nginx) должен иметь доступ к сокету.
Как настроить TCP/IP соединение через localhost (127.0.0.1)?
Если по каким-то причинам сокет недоступен или требуется TCP, указание хоста как 127.0.0.1 принудительно использует протокол TCP/IP.
<?php
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'username', 'password');
?>Php mysql host (хост php mysql)
Обращается внимание: при использовании host=localhost в Unix-системах PHP может обратиться к сокету, если он доступен. Чтобы гарантированно использовать TCP, рекомендуется указывать 127.0.0.1 или ::1 для IPv6.
Проблема: Connection refused
Если MySQL не слушает TCP-порт (установлена опция skip-networking или bind-address=127.0.0.1), соединение будет отвергнуто. Необходимо проверить my.cnf: настройка bind-address = 127.0.0.1 разрешает только локальные TCP-подключения, skip-networking отключает TCP полностью. Чтобы включить TCP, следует задать bind-address = 0.0.0.0 или закомментировать skip-networking.
Как подключиться к удалённому серверу MySQL?
Для внешнего хоста используется его IP или домен. Пример с PDO:
<?php
$dsn = 'mysql:host=192.168.1.50;port=3306;dbname=production;charset=utf8';
$pdo = new PDO($dsn, 'remote_user', 'remote_pass');
?>
установка php mysql ubuntu (установка php и mysql на ubuntu)
Перед подключением требуется убедиться, что пользователь MySQL создан с указанием хоста (например, 'remote_user'@'192.168.1.%' или '%').
Ошибка доступа: Access denied for user 'remote_user'@'...'
Для удалённого доступа необходимо выдать привилегии с указанием хоста клиента. SQL-запрос:
GRANT ALL PRIVILEGES ON production.* TO 'remote_user'@'192.168.1.%' IDENTIFIED BY 'remote_pass';
FLUSH PRIVILEGES;
Другая ошибка: Connection timed out
Рекомендуется проверить брандмауэр на сервере (iptables, ufw) и на клиенте. Порт 3306 должен быть открыт.
Как использовать mysqli для соединения с различными хостами?
Функция mysqli_connect принимает те же параметры. Пример:
<?php
$link = mysqli_connect('localhost', 'user', 'pass', 'db');
if (!$link) {
die('Ошибка соединения: ' . mysqli_connect_error());
}
echo 'Успешно: ' . mysqli_get_host_info($link);
mysqli_close($link);
?>
Для удалённого хоста в первый аргумент передаётся IP или домен. Обработка ошибок осуществляется через mysqli_connect_errno() и mysqli_connect_error().
Предупреждение: mysqli::real_connect(): (HY000/2002): No such file or directory
При указании localhost mysqli также пытается использовать сокет. Если сокет не найден - это проблема. Решением будет указать 127.0.0.1 или задать путь к сокету через ini-параметр mysqli.default_socket.
Пример 1. Универсальный скрипт подключения с выбором хоста
<?php
// Выбор типа соединения в зависимости от окружения
$host = getenv('DB_HOST') ?: 'localhost';
$port = getenv('DB_PORT') ?: '3306';
$dbname = getenv('DB_NAME') ?: 'test';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASS') ?: '';
try {
// Если хост localhost и система Unix, используем сокет
if ($host === 'localhost' && PHP_OS_FAMILY !== 'Windows') {
$socket = ini_get('pdo_mysql.default_socket') ?: '/var/run/mysqld/mysqld.sock';
$dsn = "mysql:unix_socket=$socket;dbname=$dbname;charset=utf8mb4";
} else {
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
}
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
echo "Подключение к MySQL успешно. Информация о сервере: " . $pdo->getAttribute(PDO::ATTR_SERVER_INFO);
} catch (PDOException $e) {
echo "Ошибка подключения: " . $e->getMessage();
}
?>
(при успехе) Подключение к MySQL успешно. Информация о сервере: Uptime: 123456 Threads: 2 Questions: 12345
Пояснение: скрипт автоматически определяет, использовать ли сокет для localhost в Unix. Переменные окружения позволяют гибко настраивать параметры.
Пример 2. Диагностика сетевого доступа к MySQL
# Проверка, слушает ли MySQL TCP-порт
sudo netstat -tlnp | grep 3306
# Тестовое подключение с удалённого хоста
mysql -h 192.168.1.100 -u remote_user -p -P 3306 -e "SELECT VERSION();"
# Проверка доступности порта через telnet
telnet 192.168.1.100 3306
(netstat) tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld
(mysql) +-----------+
| VERSION() |
+-----------+
| 8.0.32 |
+-----------+
(telnet) Connected to 192.168.1.100. Escape character is '^]'. J
Команды полезны для выяснения, слышит ли MySQL TCP-запросы, и для тестирования аутентификации.
Пример 3. Настройка my.cnf для удалённого доступа
[mysqld]
# Разрешить подключения с любого хоста
bind-address = 0.0.0.0
# Порт по умолчанию
port = 3306
# Отключить skip-networking (закомментировать)
# skip-networking
# Увеличить лимит соединений (опционально)
max_connections = 500
После изменения файла требуется перезапустить MySQL: sudo systemctl restart mysql или sudo service mysql restart. Также настраивается брандмауэр для открытия порта 3306.
Пример 4. Безопасное SSL-соединение через mysqli
<?php
$mysqli = mysqli_init();
$mysqli->ssl_set('/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca-cert.pem', NULL, NULL);
$mysqli->real_connect('mysql.example.com', 'ssl_user', 'ssl_pass', 'secure_db', 3306, NULL, MYSQLI_CLIENT_SSL);
if ($mysqli->connect_errno) {
die('Ошибка SSL подключения: ' . $mysqli->connect_error);
}
echo 'Соединение по SSL установлено. Шифрование: ' . ($mysqli->get_ssl_cipher() ?: 'нет');
$mysqli->close();
?>
Соединение по SSL установлено. Шифрование: TLS_AES_256_GCM_SHA384
Для работы потребуется настроить сервер MySQL на поддержку SSL (параметры ssl-ca, ssl-cert, ssl-key в my.cnf).
Пример 5. Использование PHP-функции phpinfo для определения параметров хоста
<?php
phpinfo();
?>
Запуск этого скрипта выводит информацию о конфигурации PHP. В разделах mysql или PDO отображаются значения директив mysql.default_host, mysql.default_port, pdo_mysql.default_socket. Эти параметры можно переопределить в php.ini или в коде.