Когда я пытаюсь использовать соединение сокета (не TCP) для подключения к MySQL 5.7.21 с использованием PHP 7.2.4 mysqli_connect()
в Centos 7.4, я получаю сообщение об ошибке:
Предупреждение: mysqli_connect(): (HY000/2002): нет такого файла или каталога
mysqli.default_socket =/tmp/mysql.sock
[ТуздЫ]
Гнездо = /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 используется, он работает нормально. Почему не работает сокет?
У меня есть еще один образ Centos 7.4 с MySQL 5.7.11, который работает с сокетом. Однако я не запускаю его с помощью systemctl
. Я также заметил, что даже если он работает, нет файла /tmp/mysql.sock.lock, просто /tmp/mysql.sock
Кроме того, это в основном то же самое, на самом деле, /tmp/mysql.sock не указывается нигде в файлах php.ini и my.cnf.
Вы хотите подключиться к 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, надеюсь, это поможет.
Это может быть простая проблема с разрешениями. Похоже, что только root/current user/sudo имеет права на папку tmp (поэтому терминал работает, а php - нет). Кроме того, в качестве ссылки на мою собственную настройку mysql Centos 7:
мои местоположения datadir и сокета идентичны, поэтому mysql имеет доступ к файлу.sock
--datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock