我正在尝试使用本地套接字通过mysqlnd从PHP连接到ProxySQL,但是我得到了
“没有这样的文件或目录”
,因为套接字不存在。相同的代码可以毫无问题地连接到mysql套接字。
基本上,我正在复制以下内容: https://www.percona.com/blog/2017/09/19/proxysql-improves-mysql-ssl-connections/
<?php
$i = 10000;
$user = 'percona';
$pass = 'percona';
while($i>=0) {
$mysqli = mysqli_init();
// ProxySQL
$link = mysqli_real_connect($mysqli, "localhost", $user, $pass, "", 6033, "/tmp/proxysql.sock")
or die(mysqli_connect_error());
$info = mysqli_get_host_info($mysqli);
$i--;
mysqli_close($mysqli);
unset($mysqli);
}
?>
抛出:
mysqli_real_connect(): (HY000/2002): No such file or directory
套接字文件(/tmp/proxysql.sock)实际上存在:
$ ls -all /tmp
total 12
drwxrwxrwt. 11 root root 4096 Oct 7 17:33 .
dr-xr-xr-x. 28 root root 4096 Sep 20 17:42 ..
drwxrwxrwt. 2 root root 6 Aug 8 02:40 .font-unix
drwxrwxrwt. 2 root root 6 Aug 8 02:40 .ICE-unix
srwxrwxrwx 1 proxysql proxysql 0 Oct 7 17:11 proxysql.sock
我可以使用mysql客户端通过它进行连接:
$ mysql -u myuser -p --socket /tmp/proxysql.sock --prompt='ProxySQLClient> '
如果在上面的PHP代码中我将套接字文件替换为MySQL套接字,则可以正常工作。只是proxysql.sock无法与mysqlnd一起使用。
我正在使用:
mysqlnd版本 mysqlnd 5.0.12-dev-20150407
ProxySQL版本 2.0.6
有人知道为什么mysqlnd不接受proxysql.sock吗?
更新:遵循下面@EternalHour的建议,我也尝试将proxysql.sock文件移出/ tmp,但是不幸的是,这没有什么不同。我仍然收到相同的错误。
编辑(2019-10-08):事实证明此问题与PHP无关,因为netcat也会抛出相同的问题,无论套接字文件位于/ tmp还是/ var / sockets /中:>
$ nc -U /tmp/proxysql.sock
Ncat: No such file or directory.
在相同操作系统,相同内核版本上运行的ProxySQL群集的3个节点中,有1个存在此问题,其他2个允许连接到/tmp/proxsql.sock中的套接字文件,尽管有时也存在重新启动ProxySQL会导致套接字文件被创建为私有文件(例如,其他应用程序不可用)
答案 0 :(得分:0)
许多MySQL客户端对localhost
一词有特殊的处理。 localhost
并不意味着“使用解析器来解析localhost
并通过TCP连接”,而是“使用默认路径上的unix域套接字”来使用TCP来使用127.0.0.1
。如果proxySQL还提供了unix域套接字,请提供该路径。
答案 1 :(得分:0)
对不起,每个人都很难解决这个问题-这完全是我的错。
当我在ProxySQL Admin中更改套接字文件的位置时,我正在使用以下内容
更新global_variables设置variable_value ='0.0.0.0:6033; /tmp/proxysql.sock'其中variable_name ='mysql-interfaces'; 将MYSQL变量保存到磁盘;
是的,这是“ /tmp/proxysql.sock”末尾的空格。 当我将其更改为其他位置时,我只重写了文件的前半部分(文件夹),而不重写了文件名,因此我只是不断复制空间,因此始终找不到文件或目录...
问题解决了!
很抱歉