文档章节

记一次php mysqli出现No such file or directory的错误排查

呵大官人
 呵大官人
发布于 2017/09/29 10:56
字数 914
阅读 221
收藏 9
点赞 1
评论 5

最近公司的一台开发机器坏了,需要把部分工作相关的系统转移到另一台机器上,在转移mantis的过程中发现mysql连不上了,而且错误居然是No such file or directory,这个错误信息很明显告诉我文件不存在,但是我是通过网络连mysql,何故会提示文件不存在?于是写了一段测试代码。

$mysqli = new mysqli('localhost', 'root', '', 'bugtracker');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . '): '. $mysqli->connect_error);
}

果然,还是报错!!!!

PHP Warning:  mysqli::mysqli(): (HY000/2002): No such file or directory in /root/test.php on line 2

为了确保参数没错,使用mysql客户端进行测试

mysql -uroot -hlocalhost

嗯,连上了,完全没有任何错误,那说明参数是没有问题的,可为什么相同的参数,mysql客户端连接正常,php连接不上?为了一探究竟,于是使用strace再次跑了一下这段代码,发现系统调用的connect居然不是使用tcp,而是unixdomain,文件路径是/tmp/mysql.sock,而这个文件确实不存在

connect(3, {sa_family=AF_FILE, path="/tmp/mysql.sock"}, 17) = -1 ENOENT (No such file or directory)

到这里,我已经知道错误的来源,是使用unixdomain去连接了一个不存的地址,导致报错,可为什么会使用unixdomain连接mysql呢?而这个地址又从哪里来的呢?于是又查阅了相关资(Bai)料(Du),根据史书记载,当使用localhost进行连接的时候,会使用unixdomain的方式,那这么说来mysql客户端也是使用unixdomain了?于是又对mysql使用了一次strace

connect(3, {sa_family=AF_FILE, path="/var/lib/mysql/mysql.sock"}, 110) = 0

发现connect确实是使用unixdomain,但是.......这个文件路径跟上面的完全不一样,而这个路径是存在的。。可上面/tmp/mysql.sock到底哪里来的?于是又马不停蹄的去翻阅php文档,文档明确指出,mysqli的构造函数socket参数(也就是上面提到的unixdomain的文件路径)默认从php.ini的mysqli.default_socket中取,那么再次检查参数

php -i|grep 'mysqli.default_socket'
mysqli.default_socket => no value => no value

嗯哼?没有值,闹呢这是。那这个货到底从哪里来的,为了探明事情真相,开始翻阅mysqli的源代码,果然,从源代码中找出了这么一段

if (host_len == sizeof("localhost") - 1 && !strncasecmp(host, "localhost", host_len)) {
    DBG_INF_FMT("socket=%s", socket_or_pipe? socket_or_pipe:"n/a");
    if (!socket_or_pipe) {
        socket_or_pipe = "/tmp/mysql.sock";
    }
    transport_len = mnd_sprintf(&transport, 0, "unix://%s", socket_or_pipe);
    unix_socket = TRUE;
}

如果使用localhost,就使用unixdomain,文件路径就是参数中的socket,但如果这个参数是空,那么奏写死/tmp/mysql.sock。这么说来上面报错不存在的地址就是在源代码中给写死了,所以需要自己手动设置为正确的值。于是修改mysqli的参数再次测试。

$mysqli = new mysqli('localhost', 'root', '', 'bugtracker', 3306, "/var/lib/mysql/mysql.sock");

果然好了,到这里,已经查明事情真相,连接不上就是因为使用了localhost并且mysqli.default_socket的值为空,而源码中提供的默认路径又不存在。到这里我不经要问,可否加两个判断呢?使用localhost并且socket不为空才使用unixdomain,而不提供默认路径,因为如果先装php后装mysql,那么这个default_socket就会是个空值。

当然解决这个问题其实很简单,网上有非常多的文章都有写如何解决,比如将mysqli.default_socket的值改为正确的路径,或者将localhost改成127.0.0.1等。主要还是想知道为什么不配置socket会出现错误,要找到问题的根源才好对症下药。

 

 

© 著作权归作者所有

共有 人打赏支持
呵大官人

呵大官人

粉丝 118
博文 17
码字总数 15799
作品 1
普陀
加载中

评论(5)

tuber
tuber
bugtracker
c
chdy
我也遇到过,但你解题思路清晰
dingdayu
dingdayu
虽然问题已在其他地方看到过,但是楼主解决问题的思路值得学习。
灵魂架构师
灵魂架构师
不看文章就知道是 默认sock文件没配置
张乐1024
张乐1024
赞一个!
我在linux运行php文件的时候,出现了以下这个错误,是什么原因造成的呢

PHP Warning:PHP Startup:Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/phpmysql.so' - /usr/local/php/lib/php/extensions/no-debug-non......

Apollo0121
2017/09/06
139
1
CentOs7.*下配置安装phpMyAdmin方法步骤

文章出自虎书博客,转载请注明出处。 CentOs安装配置phpMyAdmin其实非常简单,所谓的安装其实是不存在的,因为phpMyAdmin是php写的嘛,所以只需要下载安装包然后解压之后,简单配置下就可以使...

虎书博客
07/10
0
0
Linux下配置安装PHP环境

事实证明还是一键安装包好用 http://my.oschina.net/wukongcelebrity/blog/670907 参照别人的做法,遇到问题上网查,下面就是安装步骤. 一、安装Apache2.2.22 1、到官网下载 http://httpd.apa...

张悟空
2016/04/06
72
0
安装zabbix 遇到的故障

故障1: 编译zabbix时候出现下面问题,我使用的编译参数如下: ./configure --prefix=/home/zhanjun/tools/zabbix-2.4.7/ --enable-server --enable-agent --with-mysql --with-net-snmp -wi......

时光在飞
2017/06/12
0
0
mysql_connect提示"No such file or directory"错误"

昨天帮朋友安装了个lnmp的集成环境,但是部署程序后,发现怎么都不行,试了好多种方式,发现都连不上mysql,于是就写了个conn mysql的例子,发现报了上面这个错误,记录下如何结局,防止下次...

李雷岗
2016/12/02
8
0
Linux CentOS 7 安装php

安装PHP 1、 下载 http://www.php.net/downloads.php 2、解压 tar -zxvf php-5.3.16.tar.gz 获取安装php需要的支持文件:http://download.csdn.net/download/netlong339/1351852 libxml2-2.......

wanghuayuan22
2015/02/11
0
0
记一次php项目上线遇到的坑

最近上线了一个项目的后台程序(基于ThinkPHP),期间遇到了不少坑,特此记录。1,系统环境:CentOS Linux release 7.4.1708 (Core) 内核版本:3.10.0-693.el7.x86_642,软件环境 nginx-1.12...

Tyrant0532
2017/12/04
0
0
LAMP纯源码编译安装日志

一.LAMP构架的安装与经验技巧(源码安装好处。是便于管理,可以选定参数,可以使用新版本) 相关软件列表: # ls /soft/ | grep -E ".gz|.zip|.xz|.bz2" apr-1.4.5.tar.gz apr-util-1.3.12.tar...

swallow_zys
2017/02/07
0
0
PHP连接数据库

PHP 连接数据库 1.连接数据库函数 mysqli_connect(主机名,用户名,密码) 返回值 是我们的一个连接对象 如果连接失败 报错 返回false 2. 判断错误函数 mysqliconnecterror(连接对象) 错误信息...

方花
2017/11/09
0
0
解决Chrome 错误“net::ERR_INCOMPLETE_CHUNKED_ENCODING”

记一次问题排查的过程。前提自己搭建了一个发布系统,同事在使用时候突然出现了页面白板,页面不能渲染任何内容。当然第一反应是自己写的代码diff模块可能某个地方出问题了。 打印diff模块的...

叫我哀木涕
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring+jpaNo transactional EntityManager available

TransactionRequiredException: No transactional EntityManager availableEntityManager执行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事务i......

wpfc
2分钟前
0
0
八幅漫画理解使用JSON Web Token设计单点登录系统

八幅漫画理解使用JSON Web Token设计单点登录系统 Sep 07, 2015 in Engineering 上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。...

祖冲之
4分钟前
0
0
Spring框架中的设计模式(三)

Spring框架中的设计模式(三) 原创: 瑞查德-Jack 在之前的两篇文章中,我们看到了一些在Spring框架中实现的设计模式。这一次我们会发现这个流行框架使用的3种新模式。 本文将从描述两个创意...

瑞查德-Jack
7分钟前
0
0
[MicroPython]TPYBoard智能小车“飞奔的TPYBoard装甲一号”

智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具...

bodasisiter
9分钟前
0
0
桌面虚拟化VDI(Virtual Desktop Infrastructure)

为了保证员工(客户)不把公司的资料复制、传输给别人。可以把员工平时办公放在服务器上做。所以使用桌面虚拟化。就是把一个服务器虚拟出很多桌面系统(如:windows)。 桌面虚拟化最大的优势...

王坤charlie
16分钟前
2
0
自我审视及职业规划

啊哈,不知不觉已经工作了3年了。程序员作为一门技术工作,如果分级的话我的能力如何呢?该怎么提升呢? 话说,我现在的能力属于中低级的层次吧,努力在向高级努力。为什么这么说呢: 因为我觉...

一口今心
18分钟前
1
0
《PHP和MySQL Web 开发》 第12章 MySQL高级管理

我决定好好写学习笔记了,对应上书上的目录和重要信息。不瞎jb写了。从这章开始吧,然后之前写的会编辑后重发。嗯,就酱。 12.1 深入理解权限系统 妈蛋 开头就卡住了。。。我先回去修改之前的...

十万猛虎下画山
19分钟前
1
0
Python 3.6:多态的实现

多态的作用不用多说,C++用如下条件来实现多态: 要有继承 要有虚函数函数重写 要有父类指针(父类引用)指向子类对象 实际上C++使用VPTR指针来完成这个事情,其是设计模式的基础,软件分层的基...

全部原谅
19分钟前
0
0
纯Python实现鸢尾属植物数据集神经网络模型[图]

纯Python实现鸢尾属植物数据集神经网络模型[图]: 尝试使用过各大公司推出的植物识别APP吗?比如微软识花、花伴侣等这些APP。当你看到一朵不知道学名的花时,只需要打开植物识别APP,拍摄一张...

原创小博客
21分钟前
1
0
2018安卓巴士开发者大会打造Android技术盛宴

2018安卓巴士开发者大会打造Android技术盛宴2018安卓巴士开发者大会将于8月25日在上海举行,作为中国最具前沿性、专业性的安卓技术会议,将邀请来自爱奇艺、阿里、饿了么等知名企业的一线工程...

逆鳞龙
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部