PHP的 – MySQL连接不工作:2002没有这样的文件或目录

我正在尝试设置WordPress。 我有Apache和MySQL运行,帐户和数据库都设置。 我试图做一个简单的连接:

<?php $conn = mysql_connect('localhost', 'USER', 'PASSWORD'); if(!$conn) { echo 'Error: ' . mysql_errno() . ' - ' . mysql_error(); } ?> 

我总是得到这个:

错误:2002 – 没有这样的文件或目录

什么文件或目录可以谈论?

我在OS X雪豹,使用内置的Apache。 我使用x86_64 dmg安装了MySQL。

更新:我发现套接字在/tmp/mysql.sock,所以在php.ini中,我用所取代的所有错误的path。

如果您使用Linux:mysql.sock文件的path是错误的。 这通常是因为您正在使用(LAMPP)XAMPP,而不在/tmp/mysql.sock中

打开php.ini文件,find这一行:

 mysql.default_socket 

并做到这一点

 mysql.default_socket = /path/to/mysql.sock 

我有一个类似的问题,并能解决它通过解决我的MySQL与127.0.0.1而不是localhost

这可能意味着我的主机设置有问题,但这个快速修复得到了我的权利。

这是Mac OS X本地安装Apache HTTP自定义安装的MySQL

答案是基于@ alec-gorge的优秀响应,但是由于我不得不在Googleconfiguration中对其进行一些特定的更改(主要是Mac OS X特定的configuration),为了完整起见,我想在此添加它。

启用Apache HTTP的PHP5支持

确保在/etc/apache2/httpd.conf启用了PHP5支持。

使用sudo vi /etc/apache2/httpd.conf编辑文件(询问时input密码)并取消注释(从开头删除)以加载php5_module模块。

 LoadModule php5_module libexec/apache2/libphp5.so 

使用sudo apachectl start启动Apache HTTP(或者,如果它已经启动并需要重新启动以重新读取configuration文件,请重新启动)。

确保/var/log/apache2/error_log包含一行告诉你php5_module被启用 – 你应该看到PHP/5.3.15 (或类似的)。

 [notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations 

查找套接字文件的名称

当MySQL启动并运行时(使用./bin/mysqld_safe ),应该在控制台上打印出debugging行,告诉你在哪里可以find日志文件。 请注意文件名中的主机名 – 本例中的localhost – 对于您的configuration可能不同。

Logging to后的文件很重要。 这就是MySQLlogging工作的地方。

 130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'. 130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data 

打开localhost.err文件(再次,你可能会命名不同),即tail -1 /Users/jacek/apps/mysql/data/localhost.err找出套接字文件的名称 – 它应该是最后一行。

 $ tail -1 /Users/jacek/apps/mysql/data/localhost.err Version: '5.5.27' socket: '/tmp/mysql.sock' port: 3306 MySQL Community Server (GPL) 

注意socket:部分 – 这是您应该在php.ini使用的套接字文件。

还有另外一种方式(有人说更简单的方法),通过login到MySQL并运行以确定套接字文件名的位置:

 show variables like '%socket%'; 

configuration支持MySQL的PHP​​5 – /etc/php.ini

说到php.ini …

/etc目录中有/etc/php.ini.default文件。 将其复制到/etc/php.ini

 sudo cp /etc/php.ini.default /etc/php.ini 

打开/etc/php.ini并查找mysql.default_socket

 sudo vi /etc/php.ini 

mysql.default_socket的默认值是/var/mysql/mysql.sock 。 你应该把它改成你之前注意到的值 – 在我的情况下是/tmp/mysql.sock

replace/etc/php.ini文件以反映套接字文件的名称:

 mysql.default_socket = /tmp/mysql.sock mysqli.default_socket = /tmp/mysql.sock 

最终validation

重新启动Apache HTTP。

 sudo apachectl restart 

检查日志是否没有与PHP5相关的错误。 没有错误意味着你已经完成了,PHP5与MySQL应该工作正常。 恭喜!

首先,确保MySQL正在运行。 命令:mysqld start

如果仍然无法连接,那么:/etc/my.cnf是什么样的?

其他2个post是正确的,你需要检查你的套接字,因为2002是一个套接字错误。

设置LAMP的一个很好的教程是: http : //library.linode.com/lamp-guides/centos-5.3/index-print

我会检查你的php.ini文件,并validationmysql.default_socket设置是否正确,并validation你的mysqld是否正确configuration了一个它可以访问的套接字文件。 典型的默认值是“/tmp/mysql.sock”。

不是说它对你有很大的帮助,但是在最近的MySQL 版本 (甚至是最近的版本 )中,error code 2002的意思是“无法通过套接字[socket-name]连接到本地MySQL服务器”,所以可能会告诉你多一点。

我也遇到这个问题,然后我修改'本地主机'到'127.0.0.1',它的工作原理。

在configuration文件(db连接)replace'localhost'为'127.0.0.1'帮助!

在这里扩展Matthias D的答案我能用这些命令的精确path解决MySQL和MariaDB上的这个2002错误

首先获取到MySQL套接字的实际path

 netstat -ln | grep -o -m 1 '/.*mysql.sock' 

然后获取PHPpath

 php -r 'echo ini_get("mysql.default_socket") . "\n";' 

使用这两个命令输出 ,将它们连接起来:

 sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock 

如果返回No such file or directory你只需要创buildPHP的mysql.sock的path,例如,如果你的path是/var/mysql/mysql.sock你可以运行:

 sudo mkdir -p /var/mysql 

然后再次尝试sudo ln命令。

在我的情况下,我有mysqli_connect问题。
当我想连接
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error()返回我这个错误“没有这样的文件或目录”

这对我来说mysqli_connect('localhost:3306', 'myuser','mypassword')

确保你的本地服务器(MAMP,XAMPP,WAMP等)正在运行。

我有一个类似的问题。
基本上这里的问题是可能有两个mysql运行的实例。
A)一个在/etc/init.d下运行
B)灯安装在/ opt / lamp
解答:
步骤1: – 使用commnad查找所有mysql正在运行的实例“find / | grep mysqld”
第2步: – 使用服务mysql停止closures在/etc/init.d运行的服务
第3步: – 使用/ opt / lamp / lamp重新启动您的Lamp服务

你应该好好去:)

错误2002意味着MySQL无法通过套接字文件(例如/tmp/mysql.sock )连接到本地数据库服务器。

要找出您的套接字文件的位置,请运行:

 mysql_config --socket 

然后仔细检查你的应用程序是否使用正确的Unix套接字文件,或者通过TCP / IP端口进行连接。

然后仔细检查你的PHP是否有正确的MySQL套接字设置:

 php -i | grep mysql.default_socket 

并确保该文件存在

testingsockets:

 mysql --socket=/var/mysql/mysql.sock 

如果Unix套接字是错误的或者不存在,你可以将它连接起来,例如:

 ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock 

或者更正你的configuration文件(例如php.ini )。

要直接从PHPtestingPDO连接,可以运行:

 php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');" 

请检查Apache和CLI(命令行界面)之间的configuration,因为configuration可能有所不同。

可能是服务器正在运行,但是您正尝试使用不同于服务器正在侦听的TCP / IP端口,命名pipe道或Unix套接字文件进行连接。 为了纠正你需要调用一个客户端程序(例如指定--port选项)来指示正确的端口号,或正确的命名pipe道或Unix套接字文件(例如 – 套接字选项)。

请参阅: 疑难解答连接到MySQL的问题


其他可以帮助跟踪问题的utils /命令:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • xdebug.ini使用xdebug.show_exception_trace=1 XDebug
  • 在OS X上尝试使用sudo dtruss -fn mysqld ,在Linux上使用stracedebugging
  • 检查Unix套接字的权限: stat $(mysql_config --socket) ,如果你有足够的可用空间( df -h )。
  • 重新启动你的MySQL。
  • 检查net.core.somaxconn

在Mac上,在完成所有艰苦工作之前,只需在System Preferences > MySQL检查您的设置。 更多的时候,我经历过这个问题,因为The MySQL Server Instance is stopped

点击Start MySQL Serverbutton,魔术就会发生。