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的PHP5 – /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上使用strace
debugging - 检查Unix套接字的权限:
stat $(mysql_config --socket)
,如果你有足够的可用空间(df -h
)。 - 重新启动你的MySQL。
- 检查
net.core.somaxconn
。
在Mac上,在完成所有艰苦工作之前,只需在System Preferences > MySQL
检查您的设置。 更多的时候,我经历过这个问题,因为The MySQL Server Instance is stopped
。
点击Start MySQL Server
button,魔术就会发生。