localhost:socket:mysqli_connect():( HY000 / 2002):没有这样的文件或目录

时间:2018-04-19 23:46:38

标签: php mysql sockets centos

当我尝试使用套接字(非TCP)连接在Centos 7.4上使用PHP 7.2.4 mysqli_connect()连接到MySQL 5.7.21时出现错误:

  

警告:mysqli_connect():( HY000 / 2002):没有这样的文件或目录

的php.ini

  

mysqli.default_socket = /tmp/mysql.sock

的my.cnf

  

的[mysqld]
   插座= / 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*  
  

srwxrwxrwx 1 mysql mysql 0 Apr 19 22:01 /tmp/mysql.sock
  -rw ------- 1 mysql mysql 5 Apr 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通用tar.gz。我正在使用nginx 1.12.2。如果我使用127.0.0.1或locahost:3306这样使用TCP它可以正常工作。套接字为什么不工作?

更新#1

我有另一个带有MySQL 5.7.11的Centos 7.4映像,它适用于socket。但是,我不是使用systemctl启动它。我也注意到即使它正在运行,也没有/tmp/mysql.sock.lock文件,只需/tmp/mysql.sock
除此之外,它实际上是相同的,事实上,在。php.ini和my.cnf文件中没有指定/tmp/mysql.sock。

4 个答案:

答案 0 :(得分:2)

在我的情况下,解决方案是将localhost更改为127.0.0.1

我正在从WSL连接到MySQL服务器的Windows实例

答案 1 :(得分:0)

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

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

答案 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希望这会有所帮助。

答案 3 :(得分:0)

就我而言,我使用strace /usr/bin/php test.php并找到了更多信息:

  

connect(3,{sa_family = AF_UNIX,   sun_path =“ / var / run / mysqld / mysqld.sock”},29)= -1 ENOENT(无此文件   或目录)

这是由于我在监狱中奔跑而无法访问本地套接字文件,因此我被迫通过将php代码中的localhost更改为127.0.0.1来使用TCP协议。