之前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
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
总结:此次报错是由于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