以前nginx、php和mysql都搭建完成了,测试phpinfo()页面也能够显示,但在测试php与mysql之间的链接仍是有问题,报错以下:php
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 8html
No such file意思是找不到mysql.sock文件,也就是说mysql和php之间没法经过socket方式通讯。mysql
查阅网上资料,我总结出如下四种解决方法:nginx
一、修改php中的localhost为127.0.0.1,改用TCP/IP方式和MySQL通讯sql
二、卸载MySQL、从新编译安装MySQL,编译时要多指定一条参数:segmentfault
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.24/data/mysql.sockphp7
该路径与php.ini和/etc/my.cnf中指定的mysql的socket路径一致,个人是/application/mysql-5.7.24/data/mysql.sock。app
三、作个连接文件:socket
ln (-s) /application/mysql/data/mysql.sock /tmp/mysql.sockide
通过测试,软硬连接均可以。
源文件/application/mysql/data/mysql.sock是mysqli的默认socket路径,连接文件/tmp/mysql.sock是pdo_mysql的默认socket路径,经过作连接让这两个文件内容保持一致。
以上路径能够在phpinfo()页面找到。
四、修改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