从Zend教程开始 - Zend_DB_Adapter抛出异常:“SQLSTATE [HY000] [2002]没有这样的文件或目录”

69
我开始学习Zend Framework,并使用德文版的书籍《Zend Framework in Action》。在进入有趣的部分时,我的PHP Unit测试出现了错误:“Zend_Db_Adapter_Exception: SQLSTATE [HY000] [2002] No such file or directory”。通过谷歌搜索我没有找到任何提示,我已经按照书中的步骤操作了。请问有人能给我指点一下如何查找错误吗?这是一个常见的初学者错误吗?

68
请使用IP地址作为MySQL主机。 - Nguyen
3
@Nguyen,你太棒了!你比那个拥有183k的家伙帮得更多。 - abbood
8
@Nguyen - 谢谢,这也解决了我的问题(将“localhost”更改为127.0.0.1)。这是在Laravel下的PDO中,因此与Zend Framework无关。 - scipilot
2
谢谢!这也帮助了我。重要提示:不要使用 http://,只需使用 IP 地址。 - Liglo App
2
重启MySQL服务器,对我来说起到了作用! - happyhardik
显示剩余4条评论
7个回答

74
我会说你在PHP和MySQL之间存在连接问题... 像是PHP试图找到某个套接字文件,但找不到,可能是这样吧? (我遇到过几次这个问题,虽然不确定我得到的错误是否完全相同)
如果你正在运行一些基于Linux的系统,应该会有一个`my.cnf`文件,用于配置MySQL -- 在我的Ubuntu上,它位于`/etc/mysql/`目录下。
在这个文件中,可能会有类似以下内容的配置:
socket = /var/run/mysqld/mysqld.sock

PHP需要使用相同的文件 - 而且,根据您的发行版, 默认文件可能与MySQL使用的文件不同。
在这种情况下,将以下行添加到您的php.ini文件可能会有所帮助:
mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock

(你需要重新启动Apache,以便将对php.ini的修改生效)
最后一个对于PDO来说应该足够了,因为Zend Framework使用了它,但前两个不会造成任何损害,对其他应用程序也可能有用。
如果这个方法不起作用:你能否在完全独立于Zend Framework的另一个脚本中使用PDO连接到你的数据库?

也就是说,类似这样的代码是否有效 (引用)

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

如果不是的话,问题肯定不是与ZF有关,而是PHP的配置/安装问题。
如果是的话...那么,这意味着您与ZF有问题,您需要向我们提供更多关于您的设置的信息(比如您的DSN,例如?)

6
太好了!非常感谢!!!没有这个提示我就会坐在这里数小时...谢谢你的快速回复。 问题是:我已经在我的Mac上安装了MAMP(我的ubuntu服务器目前无法使用)。 但不知何故,我的单元测试使用了/etc/php.ini而不是/Applicaton/MAMP/:bla:/php.ini。所以为了继续我的代码,我只需将Mamp-ini中的套接字路径复制到etc/php.ini中即可,这样它就可以工作了! - Oliver
1
很高兴看到我能帮忙,而且你解决了问题 :-) ;; 感谢评论和解释为什么它没有起作用!玩得开心 ;-) - Pascal MARTIN
3
谢谢提示和评论,我也在使用Mac,遇到了同样的问题。我没有使用任何php.ini文件,所以我只运行了"sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock"命令,现在一切正常。 - Mathias Conradt
1
非常感谢,这很奇怪,不管怎样,问题已经以这种方式解决了。 - Sswater Shi
2
这里超级晚才加入,但想对 @PascalMARTIN 表示感谢。救星! - John Blythe
显示剩余3条评论

36

不要假设你的unix_socket在不同系统中都相同,尝试找到它。

首先,获取你的unix_socket位置

$ mysql -u root -p

输入您的 MySQL 密码并从命令行登录到 MySQL 服务器。

mysql> show variables like '%sock%';
+---------------+---------------------------------------+
| Variable_name | Value                                 |
+---------------+---------------------------------------+
| socket        | /opt/local/var/run/mysql5/mysqld.sock |
+---------------+---------------------------------------+

您的unix_soket可能会与别人不同。

然后更改您的php.ini,在以下位置找到您的php.ini文件:

<? phpinfo();

您可能安装了许多不同版本的PHP,因此请不要假设您的php.ini文件位置,可以从您的“phpinfo”中获取它;

更改您的php.ini:

mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock

mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock

pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock

然后重新启动您的Apache或php-fpm。


1
我曾经遇到过完全相同的问题:mysql.default_socket中有一个空值,所以我将该值更改为像Lijinma指出的实际套接字位置,然后它就起作用了!谢谢! - nefski

15
尝试在您的数据库设置文件中设置host=127.0.0.1,这对我有用! :) 希望它有帮助!

6

在我的OSX系统中运行Magento索引器时遇到了问题。是由于PHP通过PDO连接MySQL引起的。

在Mac OSX XAMPP中,要解决这个问题,你需要创建指向目录/var/mysql的符号链接。以下是具体步骤:

cd /var/mysql && sudo ln -s /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

如果目录 /var/mysql 不存在,我们必须使用以下命令创建它:
sudo mkdir /var/mysql

3
也适用于MAMP; 输入cd /var/mysql并键入sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock,即可创建符号链接。 - Mehmet Emre Portakal
4
不要使用这种恶劣的方法,你应该考虑为OSX PHP创建一个php.ini文件(使用命令sudo cp /private/etc/php.ini.default /private/etc/php.ini),然后查找pdo_mysql.default_socket并将其设置为:pdo_mysql.default_socket=/Applications/MAMP/tmp/mysql/mysql.sock(如果使用MAMP)。 - TCB13
cd /var/mysql && sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock 这个命令在我的 MAMP / Laravel 设置中也起作用。 - sotoz

4

我也遇到了这个问题,简单地说,通过在IP地址后添加端口号来解决。

$dsn = 'mysql:dbname=sms_messenger;host=127.0.0.1:8889';
$user = 'root';
$password = 'root';
这适用于Mac OS
如果您不知道您的mysql端口号,那么
您可以在MAMP主页上轻松找到端口号
或者
在运行MAMP服务器时输入以下命令来将终端切换到mysql
OMBP:mamp Omal$ /Applications/MAMP/Library/bin/mysql --host=localhost -uroot -proot

然后输入

mysql> SHOW GLOBAL VARIABLES LIKE 'PORT';

1

看起来mysql服务要么没有工作,要么停止了。 您可以使用以下命令启动它(在Ubuntu中):

service mysql start

应该可以工作!如果您使用的操作系统不是Ubuntu,则请使用适当的方式启动mysql。


1
这个错误是因为mysql正在尝试通过错误的套接字文件进行连接。
对于MAMP服务器,请尝试使用以下命令。
cd /var/mysql && sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock

or

cd /tmp && sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock

这些命令适用于XAMPP服务器

    cd /var/mysql && sudo ln -s /Applications/XAMPP/tmp/mysql/mysql.sock

或者

    cd /tmp && sudo ln -s /Applications/XAMPP/tmp/mysql/mysql.sock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接