Настройка соединения с базой данных в PHP: указание host в php.ini
Основные способы настройки host в php.ini
Как задать хост MySQL по умолчанию для расширения PDO?
Наиболее современный и рекомендуемый вариант - использование директивы pdo_mysql.default_host. Она задаёт хост сервера MySQL для всех соединений, создаваемых через PDO без явного указания хоста.
Пошаговая инструкция
- Найдите файл php.ini (обычно расположен по пути /etc/php/версия/cli/php.ini или /etc/php/версия/apache2/php.ini).
- Раскомментируйте или добавьте строку:
pdo_mysql.default_host = "localhost"Moodle config php (php: конфигурация moodle (config.php))
- При необходимости укажите порт:
pdo_mysql.default_host = "localhost:3307"Phpmyadmin config inc php (php: конфигурация phpmyadmin (config.inc.php))
- Перезапустите веб-сервер или PHP-FPM, чтобы изменения вступили в силу.
- Проверьте значение с помощью phpinfo() или через PHP:
echo ini_get('pdo_mysql.default_host');Config config php домен (php: настройка конфигурации для домена)
После настройки можно подключаться без указания хоста:
$pdo = new PDO('mysql:dbname=test'); // host будет взят из php.iniWp admin config php (php: конфигурация wordpress (wp-admin/config.php))
Проблема: Если директива не установлена, PDO будет использовать localhost по умолчанию, но при указании неверного хоста возникает исключение PDOException с сообщением "SQLSTATE[HY000] [2002] Connection refused". Проверьте, что сервер MySQL запущен и доступен по указанному адресу.
Цель: Упрощение кода при развёртывании приложения на разных серверах - достаточно изменить host в одном месте конфигурации.
Как настроить хост для расширения mysqli через php.ini?
Директива mysqli.default_host аналогична предыдущей, но для расширения mysqli. Работает только при использовании процедурного стиля без указания хоста.
mysqli.default_host = "127.0.0.1"Config php host (php: настройка host в конфигурационном файле)
Пример подключения:
$mysqli = new mysqli(); // host будет взят из php.iniConfig ini php (php: настройка php.ini)
Типичная ошибка: Если задано несколько директив (mysql.default_host, mysqli.default_host, pdo_mysql.default_host), они не переопределяют друг друга - каждая работает для своего расширения. Путаница может возникнуть, если для одного приложения используются разные расширения.
Использование: рекомендуется для проектов на процедурном mysqli, особенно когда миграция на PDO невозможна.
Как использовать устаревшую директиву mysql.default_host?
Расширение mysql_* удалено из PHP 7, поэтому данная директива (mysql.default_host) может быть полезна только в крайне старых проектах, где ещё используется PHP 5.6 или ниже. Указывать её в современных версиях бессмысленно.
mysql.default_host = "localhost"Php config connect (php: настройка подключения к базе данных в config)
Проблема: При попытке использовать mysql_connect() в PHP 7+ возникает фатальная ошибка. Решение - перейти на mysqli или PDO.
Случай использования: поддержка наследия до перехода на новую версию PHP.
Как переопределить host для конкретной директории без прав на php.ini?
На общем хостинге часто нет доступа к глобальному php.ini. Тогда можно создать файл .user.ini в корневой директории сайта. В нём работают те же директивы, что и в php.ini (кроме некоторых).
; .user.ini
pdo_mysql.default_host = "mydb.example.com"
mysqli.default_host = "mydb.example.com"Define config php (php: определение констант через define в конфигурации)
- Поместите файл в корень сайта.
- Убедитесь, что веб-сервер настроен на чтение .user.ini (обычно включено по умолчанию).
- Изменения применяются без перезапуска сервера (проверяется при каждом запросе).
Проблема: Не все директивы можно задать в .user.ini. Список доступных - в документации PHP. Также директивы из .user.ini имеют приоритет над глобальными, но не над настройками из скрипта через ini_set().
Случай: размещение нескольких проектов на одном сервере с разными базами данных.
Как задать хост через переменные окружения в php.ini?
В php.ini можно использовать подстановку переменных окружения, если они установлены в системе. Это удобно для контейнерных сред (Docker) или CI/CD.
pdo_mysql.default_host = "${DB_HOST}"
Переменная окружения DB_HOST должна быть экспортирована (например, export DB_HOST=mysql.example.com).
Проблема: Поддержка подстановки переменных окружения в php.ini появилась в PHP 8.0. В более старых версиях эта возможность отсутствует. Решение - использовать обёртки в коде.
Цель: централизованное управление конфигурацией через переменные окружения, без жёстко зашитых данных.
Общие проблемы и способы их решения
- Ошибка "Unknown MySQL server host" - неверно указан host или проблемы с DNS. Проверьте имя хоста через ping или nslookup.
- Connection refused - сервер MySQL не принимает соединения (порт неверный, служба остановлена). Убедитесь, что MySQL запущен: sudo systemctl status mysql.
- Значения из php.ini игнорируются - возможно, используется PHP-FPM пул со своим конфигом (pool.d/*.conf). Проверьте, не задана ли директива в пуле с приоритетом выше.
- Изменения не вступают в силу - не забывайте перезагружать сервер (sudo systemctl reload php*-fpm или apache2ctl graceful).
Расширенные примеры настройки host в конфигурации PHP
Пример 1. Проверка текущих настроек из php.ini
С помощью небольшого PHP-скрипта можно вывести все значения директив, связанных с хостами:
<?php
$directives = [
'pdo_mysql.default_host',
'mysqli.default_host',
'mysql.default_host',
'pdo_mysql.default_port',
'mysqli.default_port',
'mysql.default_port'
];
foreach ($directives as $d) {
$val = ini_get($d) ?: 'not set';
echo "$d: $val\n";
}
?>
pdo_mysql.default_host: localhost mysqli.default_host: not set mysql.default_host: not set pdo_mysql.default_port: 3306 mysqli.default_port: 3306 mysql.default_port: 3306
Пример 2. Использование ini_set() для временной смены хоста
Иногда требуется изменить хост в конфигурации только для текущего процесса. Это можно сделать с помощью ini_set(), но только для директив, поддерживающих изменение на этапе выполнения (обычно pdo_mysql.default_host не входит в их число, однако можно задать в коде подключения явно). Более практичный подход - использовать putenv() и подстановку в php.ini, если версия PHP 8.0+.
<?php
putenv('DB_HOST=192.168.1.100');
// При этом в php.ini должно быть: pdo_mysql.default_host = "${DB_HOST}"
$pdo = new PDO('mysql:dbname=test'); // используется хост из переменной окружения
?>
Результат: успешное подключение к хосту 192.168.1.100, если указан правильный порт.
Пример 3. Настройка host через .user.ini с проверкой
Создайте файл .user.ini в корневой директории со следующим содержимым:
; .user.ini
pdo_mysql.default_host = "db.internal"
pdo_mysql.default_port = 3307
Затем запросите страницу, которая выводит phpinfo() - в секции PDO должно появиться новое значение. Альтернативно:
<?php
$pdo = new PDO('mysql:dbname=test');
echo $pdo->getAttribute(PDO::ATTR_SERVER_INFO);
?>
Uptime: 123456 Threads: 1 Questions: 789
Если подключение провалилось, будет исключение.
Пример 4. Указание host с портом и сокетом
В директиве можно задать не только хост, но и порт, и даже путь к Unix-сокету:
; использование TCP через порт 3307
pdo_mysql.default_host = "127.0.0.1:3307"
; использование Unix-сокета (для локального подключения)
mysqli.default_host = "localhost:/var/run/mysqld/mysqld.sock"
Второй вариант требует, чтобы директива mysql.default_socket или pdo_mysql.default_socket также была правильно настроена, иначе может произойти ошибка.
Пример 5. Обработка ошибок при неверном хосте
<?php
try {
$pdo = new PDO('mysql:host=wronghost;dbname=test', 'root', '');
} catch (PDOException $e) {
echo "Ошибка подключения: " . $e->getMessage();
}
?>
Ошибка подключения: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for wronghost failed: Name or service not known
Эта ошибка возникает, если DNS не может разрешить имя wronghost. Рекомендуется использовать IP-адрес или проверять запись в /etc/hosts.
Пример 6. Множественные значения для разных расширений
Если в php.ini заданы несколько директив, каждое расширение использует свою:
; php.ini
pdo_mysql.default_host = "pdo-host"
mysqli.default_host = "mysqli-host"
mysql.default_host = "mysql-host"
Тестируем в скрипте:
<?php
echo 'PDO: ' . ini_get('pdo_mysql.default_host') . '
';
echo 'mysqli: ' . ini_get('mysqli.default_host') . '
';
echo 'mysql: ' . ini_get('mysql.default_host') . '
';
?>
PDO: pdo-host mysqli: mysqli-host mysql: mysql-host
Важно помнить, что расширение mysql уже не поддерживается.