当我尝试使用套接字(而不是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文件中都没有指定。
4条答案
按热度按时间cgyqldqp1#
您想通过代码中的套接字连接到mysql
尝试将此替换为:
这里也有一个解决方案https://serverfault.com/questions/673854/how-to-let-php-connect-to-database-by-using-unix-socket-joomla 希望这有帮助。
8yparm6h2#
在我的例子中,解决方案是将localhost更改为127.0.0.1
我正在从wsl连接到mysql服务器的windows示例
kuhbmx9i3#
这可能是一个简单的权限问题。似乎只有root/current user/sudo拥有tmp文件夹的权限(这就是为什么terminal工作而php不工作)。另外,作为我自己centos 7 mysql设置的参考:
我的datadir和socket位置是相同的,因此mysql可以访问.sock文件
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。