localhost:socket:mysqli\u connect():(hy000/2002):没有这样的文件或目录

bxgwgixi  于 2021-06-24  发布在  Mysql
关注(0)|答案(4)|浏览(343)

当我尝试使用套接字(而不是tcp)连接来使用PHP7.2.4连接到MySQL5.7.21时 mysqli_connect() 在centos 7.4上,我得到一个错误:
警告:mysqli\u connect():(hy000/2002):没有这样的文件或目录

php.ini文件

mysqli.default\u socket=/tmp/mysql.sock

我的.cnf

[我的qld]
socket=/tmp/mysql.sock
...
[客户]
socket=/tmp/mysql.sock
命令行的mysql连接工作正常:

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

欢迎使用mysql监视器。命令以结束;或\g。
你的mysql连接id是3
服务器版本:5.7.21 mysql社区服务器(gpl)

ls -l /tmp/my*

srwxrwx 1 mysql mysql 0 4月19日22:01/tmp/mysql.sock
-rw-----1 mysql 4月5日19:22/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。我正在使用nginx1.12.2。如果我使用127.0.0.1或locahost:3306 such 使用tcp,工作正常。为什么插座不工作?

更新#1

我有另一个centos 7.4映像与MySQL5.7.11,它与套接字一起工作。但是,我不使用 systemctl . 我还注意到,即使它正在运行,也没有/tmp/mysql.sock.lock文件,只有/tmp/mysql.sock
除此之外,基本上是相同的,事实上,/tmp/mysql.sock在php.ini和my.cnf文件中都没有指定。

cgyqldqp

cgyqldqp1#

您想通过代码中的套接字连接到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 希望这有帮助。

8yparm6h

8yparm6h2#

在我的例子中,解决方案是将localhost更改为127.0.0.1
我正在从wsl连接到mysql服务器的windows示例

kuhbmx9i

kuhbmx9i3#

这可能是一个简单的权限问题。似乎只有root/current user/sudo拥有tmp文件夹的权限(这就是为什么terminal工作而php不工作)。另外,作为我自己centos 7 mysql设置的参考:
我的datadir和socket位置是相同的,因此mysql可以访问.sock文件

--datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock
rbpvctlc

rbpvctlc4#

在我的情况下,我用 strace /usr/bin/php test.php 并找到更多信息:
connect(3,{sa\u family=af\u unix,sun\u path=“/var/run/mysqld/mysqld.sock”},29)=-1 enoint(没有这样的文件或目录)
这是因为我在监狱里运行,无法访问本地套接字文件,所以我被迫使用tcp协议,在php代码中将localhost更改为127.0.0.1。

相关问题