Настройка соединения с базой данных в PHP: указание host в php.ini

Раздел: Администрирование PHP -> Конфигурация и настройка PHP

Основные способы настройки host в php.ini

Как задать хост MySQL по умолчанию для расширения PDO?

Наиболее современный и рекомендуемый вариант - использование директивы pdo_mysql.default_host. Она задаёт хост сервера MySQL для всех соединений, создаваемых через PDO без явного указания хоста.

Пошаговая инструкция

  1. Найдите файл php.ini (обычно расположен по пути /etc/php/версия/cli/php.ini или /etc/php/версия/apache2/php.ini).
  2. Раскомментируйте или добавьте строку:
    pdo_mysql.default_host = "localhost"

    Moodle config php (php: конфигурация moodle (config.php))

  3. При необходимости укажите порт:
    pdo_mysql.default_host = "localhost:3307"

    Phpmyadmin config inc php (php: конфигурация phpmyadmin (config.inc.php))

  4. Перезапустите веб-сервер или PHP-FPM, чтобы изменения вступили в силу.
  5. Проверьте значение с помощью phpinfo() или через PHP:
    echo ini_get('pdo_mysql.default_host');

    Config config php домен (php: настройка конфигурации для домена)

После настройки можно подключаться без указания хоста:

$pdo = new PDO('mysql:dbname=test'); // host будет взят из php.ini

Wp 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.ini

Config 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 в конфигурации)

  1. Поместите файл в корень сайта.
  2. Убедитесь, что веб-сервер настроен на чтение .user.ini (обычно включено по умолчанию).
  3. Изменения применяются без перезапуска сервера (проверяется при каждом запросе).

Проблема: Не все директивы можно задать в .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 уже не поддерживается.

PHP: настройка host в конфигурационном файле - comments

En
Config php host (php)