others - PHP - MySQL连接不工作: 2002 No such file or directory

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


<?php


 $conn = mysql_connect('localhost', 'USER', 'PASSWORD');


 if(!$conn) {


 echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();


 }


?>



我总是得到这个:

Error : 2002 - no such file or directory

我在OS X上使用Apache。我使用x86 DMG安装了MySQL 。

时间:

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

打开php.ini文件并找到此行:


mysql.default_socket



让它


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



我有一个类似的问题,可以通过用127.0.0.1代替localhost来解决。

这也许意味着我的主机设置出了问题,但是快速解决了。

这是针对Mac OS X的,Apache HTTP的本地安装和定制的MySQL安装。

启用Apache HTTP的PHP5支持

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

使用sudo vi/etc/apache2/httpd.conf (当被询问时输入密码)编辑文件,并且取消注释(从开始处删除; )以加载php5_module模块。


LoadModule php5_module libexec/apache2/libphp5.so



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

确保/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 )时,应该将调试行打印到控制台,告诉你可以在哪里找到日志文件,注意在我的例子中文件名- localhost中的主机名-可能对于你的配置是不同的。

Logging to之后的文件很重要,这就是MySQL记录其工作的地方。


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中使用的套接字文件。

还有另一种方法(有人说更简单的方法)通过登录到MySQL,并且运行来确定套接字名称文件的位置:


show variables like '%socket%';



使用MySQL支持配置PHP5 -/etc/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 。

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


mysql.default_socket = /tmp/mysql.sock


mysqli.default_socket = /tmp/mysql.sock



最终验证

重新启动Apache HTTP 。


sudo apachectl restart 



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

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

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

检查你的php.ini文件,并验证mysql.default_socket是否正确设置,并且确认你使用的套接字文件是否正确配置。 典型默认值为"/tmp/mysql.sock".

首先获取MySQL套接字的实际路径:


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



然后获取PHP路径:


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



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


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



如果返回 No such file or directory你只需要创建到PHP mysql.sock的路径,例如,如果你的路径是/var/mysql/mysql.sock,你运行:


sudo mkdir -p /var/mysql



然后再次尝试sudo ln命令。

重新启动mysql服务器可能有帮助,在我看来,重启服务器节省了很多时间。


service mysql restart



sudo service mysql restart

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

要查找你的套接字文件所在的位置,请运行:


mysql_config --socket



然后再次检查应用程序使用正确的Unix套接字文件,或者通过tcp/ip端口连接。

然后检查PHP是否设置了正确的MySQL套接字:


php -i | grep mysql.default_socket



并确保文件存在。

测试套接字:


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



如果Unix套接字错误或不存在,你可以对它进行链接,例如:


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



或者修改你的配置文件(例如,php.ini )。

要直接从PHP测试PDO连接,你可以运行:


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



检查Apache和CLI (command-line界面)之间的配置,因为配置可能会不同。

指定--port选项,以指示正确的端口号,或适当的命名管道或Unix套接字文件(例如,--socket选项)。

请参见:连接到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使用strace进行Linux调试
  • 检查Unix套接字的权限: stat $(mysql_config --socket),如果你有足够的可用空间,
  • 重新启动你的MySQL ,
  • 检查net.core.somaxconn 。

...