之前nginx、php和mysql都搭建完成了,测试phpinfo()页面也可以显示,但在测试php与mysql之间的连接还是有问题,报错如下:

Warning: mysqli::__construct(): (HY000/2002): No such file or directory in /application/nginx-1.14.2/html/mysql.php on line 2
OK!可以连接
Warning: mysqli::close(): Couldn't fetch mysqli in /application/nginx-1.14.2/html/mysql.php on line 8

《Web集群实战》第6章PHP与MySQL连接测试遇到No such file or dir解决方法_PHP与MySQL的连接测试

No such file意思是找不到mysql.sock文件,也就是说mysql和php之间无法通过socket方式通信。

查阅网上资料,我总结出以下四种解决方法:

1、修改php中的localhost为127.0.0.1,改用TCP/IP方式和MySQL通信

2、卸载MySQL、重新编译安装MySQL,编译时要多指定一条参数:

-DMYSQL_UNIX_ADDR=/application/mysql-5.7.24/data/mysql.sock

该路径与php.ini和/etc/my.cnf中指定的mysql的socket路径一致,我的是/application/mysql-5.7.24/data/mysql.sock。

3、做个链接文件:

ln (-s) /application/mysql/data/mysql.sock /tmp/mysql.sock

经过测试,软硬链接都可以。

源文件/application/mysql/data/mysql.sock是mysqli的默认socket路径,链接文件/tmp/mysql.sock是pdo_mysql的默认socket路径,通过做链接让这两个文件内容保持一致。

以上路径可以在phpinfo()页面找到。

4、修改php文件第2行,指定此次php页面通信的socket为/application/mysql/data/mysql.sock:

$mysqli = new mysqli("localhost","root","oldboy123","mysql","3306","/application/mysql/data/mysql.sock"); 

刷新页面,页面如果报错Permission denied

(Warning: mysqli::__construct(): (HY000/2002): Permission denied in /application/nginx-1.14.2/html/mysql3.php on line 2

OK!可以连接

Warning: mysqli::close(): Couldn't fetch mysqli in /application/nginx-1.14.2/html/mysql3.php on line 8)

检查php用户有没有读取/application/mysql/data/mysql.sock的权限。

[root@THZZC-1 ~]# ll /application/mysql/data/mysql.sock

srwxrwxrwx 2 mysql mysql 0 Apr  7 20:11 /application/mysql/data/mysql.sock

[root@THZZC-1 ~]# ll /application/mysql/data/ -d

drwxr-x--- 5 mysql mysql 4096 Apr  7 20:11 /application/mysql/data/#<==mysql.sock有读权限,但上一级目录data没有读取data目录下文件(mysql.sock)的权限

[root@THZZC-1 ~]# chmod o=rx /application/mysql/data/

[root@THZZC-1 ~]# ll /application/mysql/data/ -d

drwxr-xr-x 5 mysql mysql 4096 Apr  7 20:11 /application/mysql/data/#<==读目录下文件权限需要r、x

《Web集群实战》第6章PHP与MySQL连接测试遇到No such file or dir解决方法_PHP与MySQL的连接测试_02

总结:此次报错是由于mysql默认的socket配置有问题,导致socket方式无法通信,方法1转移了阵地,改用TCP/IP方式与MySQL通信。方法2和3的本质相同,都是为了指定一致的默认socket路径。方法4是曲线救国,做链接让两个socket文件内容一模一样,从而实现socket通信。


##### php7测试文件mysql.php的代码如下:

cat /application/nginx/html/mysql.php

<?php 

    $mysqli = new mysqli("localhost","root","oldboy123"); 

    if(!$mysqli)  { 

        echo"FAILD!连接错误,用户名密码不对"; 

    }else{ 

        echo"OK!可以连接"; 

    } 

    $mysqli->close(); 

?> 


相关链接:https://segmentfault.com/q/1010000000328531