![SQLSTATE[HY000] [2003] Невозможно подключиться к серверу MySQL на «127.0.0.1» (13), но «localhost» работает](https://rvso.com/image/97160/SQLSTATE%5BHY000%5D%20%5B2003%5D%20%D0%9D%D0%B5%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C%D1%81%D1%8F%20%D0%BA%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D1%83%20MySQL%20%D0%BD%D0%B0%20%C2%AB127.0.0.1%C2%BB%20(13)%2C%20%D0%BD%D0%BE%20%C2%ABlocalhost%C2%BB%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82.png)
Cent os Apache + php + MySQL из php при попытке подключения к MySQL по адресу 127.0.0.1 возникает ошибка. Если заменить строку 127.0.0.1
на localhost
все работает без проблем. Проблема только с php в браузере. Если в консоли выполнить
php -r "var_dump (mysqli_connect ( '127.0.0.1', 'user', 'pass', 'db_name'))"
нет ошибки. Также, если консоль ввести
mysql -u user -h 127.0.0.1 -p db_name
или
mysql -u user -h localhost -p db_name
тоже все работает. В чем может быть проблема?
Версии программного обеспечения
- PHP-5.6.26
- MySQL-5.5.53
- Апач 2.2.15
Окончательно,
$ host localhost
localhost has address 127.0.0.1
Рабочий PHP-код:
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
PHP-код не работает:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
SQLSTATE[HY000] [2003] Невозможно подключиться к серверу MySQL на «127.0.0.1» (13)
Рабочий PHP-код:
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");
PHP-код не работает:
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
решение:
setsebool httpd_can_network_connect_db on
решение1
В соответствии сэтот (непринятый) ответ на StackOverflow, причина в том, что MySQL интерпретирует localhost
по-другому 127.0.0.1
. Этоподтверждено в документации, см. абзац, начинающийся с "В Unix программы MySQL обрабатывают имя хоста localhost
особым образом.".
- Это
127.0.0.1
явный адрес IPv4, поэтому клиент пытается подключиться по протоколу TCP/IP. - Это
localhost
неявный намек на использование локального хоста, который MySQL реализует, где это возможно, через локальный сокет, а не через TCP/IP.
Поскольку ваше localhost
соединение работает, а 127.0.0.1
другое — нет, возможно, что причиной является одна из следующих проблем:
- Ваши разрешения базы данных запрещают подключение из
127.0.0.1
- у вас есть правило брандмауэра, блокирующее все попытки входящего подключения к базе данных по протоколу TCP/IP
- вы изменили
bind
запись конфигурации для MySQL, так что она не привязывается к адресу обратной связи
Учитывая код ошибки 13 (доступ запрещен), я бы исследовал первый из них прежде, чем остальные два.