localhost: socket: mysqli_connect (): (HY000 / 2002): нет такого файла или каталога

0

Когда я пытаюсь использовать соединение сокета (не TCP) для подключения к MySQL 5.7.21 с использованием PHP 7.2.4 mysqli_connect() в Centos 7.4, я получаю сообщение об ошибке:

Предупреждение: mysqli_connect(): (HY000/2002): нет такого файла или каталога

php.ini

mysqli.default_socket =/tmp/mysql.sock

my.cnf

[ТуздЫ]
Гнездо = /TMP/mysql.sock
...
[Клиент]
Гнездо = /TMP/mysql.sock

Соединение MySQL из командной строки отлично работает:

/usr/local/mysql57/bin/mysql --socket tmp/mysql.sock --host localhost -u root -p  

Добро пожаловать на монитор MySQL. Команды заканчиваются; или \g.
Ваш идентификатор соединения с MySQL равен 3
Версия сервера: 5.7.21 Сервер сообщества MySQL (GPL)

ls -l /tmp/my*  

srwxrwxrwx 1 mysql mysql 0 Apr 19 22:01/tmp/mysql.sock
-rw ------- 1 mysql mysql 5 апр 19 22:01/tmp/mysql.sock.lock

ps -edf | grep mysql  

mysql 3593 3329 0 22:01? 00:00:03/usr/local/mysql57/bin/mysqld --defaults-file =/usr/local/mysql57/my.cnf --basedir =/usr/local/mysql57 --datadir =/mysql57 --plugin -dir =/usr/local/mysql57/lib/plugin --log-error = myhost.err -pid-file = myhost.pid --socket =/tmp/mysql.sock --port = 3306

$dblink = mysqli_connect('localhost', 'root', 'rootpass', 'testdb', 3306, '/tmp/mysql.sock');
if (mysqli_connect_errno($dblink)) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

Установлен MySQL generic tar.gz. Я использую nginx 1.12.2. Если я использую 127.0.0.1 или locahost: 3306, так что TCP используется, он работает нормально. Почему не работает сокет?

Обновление # 1

У меня есть еще один образ Centos 7.4 с MySQL 5.7.11, который работает с сокетом. Однако я не запускаю его с помощью systemctl. Я также заметил, что даже если он работает, нет файла /tmp/mysql.sock.lock, просто /tmp/mysql.sock
Кроме того, это в основном то же самое, на самом деле, /tmp/mysql.sock не указывается нигде в файлах php.ini и my.cnf.

  • 0
    работает PDO ??
  • 0
    Та же ошибка при использовании pdo.
Теги:
sockets
centos

2 ответа

0

Вы хотите подключиться к mysql через сокет в вашем коде

$dblink = mysqli_connect('localhost', 'root', 'rootpass', 'testdb', 3306, '/tmp/mysql.sock');

попробуйте заменить это на:

$dblink = mysqli_connect('/tmp/mysql.sock', 'root', 'rootpass', 'testdb', 3306);

есть решение, доступное здесь, а также https://serverfault.com/questions/673854/how-to-let-php-connect-to-database-by-using-unix-socket-joomla, надеюсь, это поможет.

  • 0
    Также не работает, ошибка: mysqli_connect (): php_network_getaddresses: getaddrinfo fail: имя или служба неизвестна. Это было для mysql_connect, а не для mysqli, так что я думаю, что он устарел.
0

Это может быть простая проблема с разрешениями. Похоже, что только root/current user/sudo имеет права на папку tmp (поэтому терминал работает, а php - нет). Кроме того, в качестве ссылки на мою собственную настройку mysql Centos 7:
мои местоположения datadir и сокета идентичны, поэтому mysql имеет доступ к файлу.sock

--datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock
  • 0
    ls -l / показывает 777 для / tmp, так что любой может получить к нему доступ: drwxrwxrwt. 11 root root 4096 апр 20 02:29 tmp

Ещё вопросы

Сообщество Overcoder
Наверх
Меню