@sferg1985
Рассказывать долго. Сами спросите о чём нужно.

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

Здравствуйте. На Debian Jessie установил Nginx + PHP7-FPM + MariaDB 10. Пытаюсь выполнить тестовый скриптик:

<?php
$mysqli = new mysqli(":/var/run/mysqld/mysqld.sock", "root", "password");
if (mysqli_connect_errno()) {
    printf("Ошибка соединения: %s\n", mysqli_connect_error());
    exit();
}
    printf("Версия сервера MySQL: %s\n", $mysqli->server_info);
$mysqli->close();
?>

Получаю в ответ:
Ошибка соединения: php_network_getaddresses: getaddrinfo failed: Name or service not known

Меняю
$mysqli = new mysqli(":/var/run/mysqld/mysqld.sock", "root", "password");

на
$mysqli = new mysqli("localhost:/var/run/mysqld/mysqld.sock", "root", "password");

получаю:
Ошибка соединения: Connection refused

Если же прописать:
$mysqli = new mysqli("localhost", "root", "password");

То всё выводится как нужно:
Версия сервера MySQL: 5.5.5-10.1.16-MariaDB-1~jessie

Подскажите, пожалуйста, каким образом заставить PHP обращаться к БД через сокет? Что-то не могу сообразить, в чём дело.

P.S. Сам файл сокета на месте:
# locate mysqld.sock
/run/mysqld/mysqld.sock


# php-fpm7.0 --info | grep .default_socket
mysqli.default_socket => no value => no value
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
  • Вопрос задан
  • 3639 просмотров
Решения вопроса 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
У вас по факту сокет-файл находится в /run/mysqld/mysqld.sock, а вы присоедняетесь к /var/run/mysqld/mysqld.sock

Плюс читаем документацию, а там сокет идет последним параметром.
Часть первая, удостоверьтесь, что сокет файл в нужном месте. Подключитесь к MySQL и посмотрите, что у вас тут:
show variables like 'socket'
У меня там /opt/local/var/run/mariadb-10.0/mysqld.sock.

Значит мне нужно исправить php.ini
; я ленивый, поэтому настраиваю все варианты подключений
[MySQL]
mysql.default_socket = /opt/local/var/run/mariadb-10.0/mysqld.sock
[MySQLi]
mysqli.default_socket = /opt/local/var/run/mariadb-10.0/mysqld.sock
[Pdo_mysql]
pdo_mysql.default_socket=/opt/local/var/run/mariadb-10.0/mysqld.sock


После этого ваши скрипты должны подключаться через сокет.
// здесь должно быть соединение через сокет
$mysqli = new mysqli("localhost", "root", "password");
// можно принудительно указать путь к сокету
// я очень не рекомендую так делать, 
// т.к. возможны проблемы с развертыванием ваших скриптов в других окружениях
$mysqli = new mysqli("localhost",  "root", "password", "db", 0, 
                              "/opt/local/var/run/mariadb-10.0/mysqld.sock");
Ответ написан
landergate
@landergate
IT-шный jack-of-all-trades
$mysqli = new mysqli('localhost', 'root', 'password', '', 0, '/var/run/mysqld/mysqld.sock');

php.net/manual/ru/mysqli.construct.php
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы