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

以前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

nosuchfile.png

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

ok.png

总结:这次报错是因为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

相关文章
相关标签/搜索