在Laravel Homestead中,SQLSTATE [HY000] [2002]连接被拒绝。

83

使用Mac OS X和Homestead 2.2.1与Laravel 5.2。

在终端(在我的项目文件夹中的Homestead中),我可以执行php artisan命令以查看所有可用命令。当我尝试运行php artisan migrate时,出现连接错误:
SQLSTATE [HY000] [2002] Connection refused


我已经设置了一个Laravel项目,并进行了这些.env设置。

DB_HOST=127.0.0.1
DB_DATABASE=tcv
DB_USERNAME=homestead
DB_PASSWORD=secret

我也尝试过使用localhost作为DB_HOST,以及root作为DB_USERNAME和DB_PASSWORD,以及所有可能的组合!


在Sequel Pro(数据库管理应用程序)中,我可以使用这些设置连接。

Host       127.0.0.1
Username   homestead
Password   secret
Database   tcv
Port       33060

但是这个数据库显然是空的,因为我不能从终端迁移数据到它......

据我所知,这是一个配置问题,因为我可以用Sequel Pro连接它。但是我真的不知道哪里设置错了。

谢谢你的帮助!!

编辑
出于某种原因,当我将我的项目移到MAMP并运行php artisan migrate时,我得到了相同的SQLSTATE[HY000] [2002] Connection refused错误。
现在我完全迷失了......


11
你尝试把IP地址从127.0.0.1改成localhost了吗?很久以前我也遇到过类似的问题,这对我有效(现在无法测试,因为不在Mac上)。 - Adam
@Adam 是的,我有(就像我在原始问题中说的那样),但并没有改变任何事情。但还是谢谢你的意见... - nclsvh
1
我的错,我没看到你已经尝试过了。 - Adam
1
你的应用程序正在虚拟机上查找数据库。我假设Sequel Pro可以访问,因为它在主机上。你必须使用实际的计算机IP地址从家庭托管中访问数据库。 - tnash
我正在使用 Mac 和 MAMP 作为本地服务器,在文件 .env 中,我只需将 DB_HOST=127.0.0.1 更改为 DB_HOST=localhost,它就可以正常工作了,谢谢 @Adam。 - Rolly
显示剩余5条评论
32个回答

134

我刚遇到这个问题,并发现在.env文件中将127.0.0.1更改为localhost解决了它。

DB_HOST=localhost

2
FYI MAMP用户...在MAMP服务器上运行时,127.0.0.1可用,但在MAMP PRO服务器上需要使用localhost! - James Cushing
当我使用laradock.io(Laravel 8)时,我收到了相同的错误消息。然后我需要设置我的计算机的真实IP地址。我猜这是由于请求来自PHP-fpm容器内部造成的。 - olle.holm
这个解决了我在一个共享主机的实时服务器上的问题。我的网站一直运行良好,直到几周后它自己崩溃了,通过这样做,它被修复了,但我不知道这是如何确切地工作的。 - Billions.A.Joel
修改后,你可能会出现类似于 SQLSTATE[HY000] [2002] No such file or directory 的错误。如果在 StackOverflow 上搜索,人们会建议使用 127.0.0.1。这是一个死结。我曾经遇到过这个问题并试图从 MySQL 方面进行搜索,找到了一个可以解决的答案。在这里查看:https://serverfault.com/a/337928基本上,你需要在 my.cnf 文件中设置 protocol=tcp,以告诉 MySQL 使用 TCP 协议。然后在 Laravel 配置中使用 127.0.0.1,事情就会正常运行。 - Abhilash Mandaliya
这在我的生产服务器上确实起作用了。相当奇怪。 - Vrrayz
显示剩余2条评论

54

问题

Laravel中,你可以在config/database.php文件中找到所有连接设置。在项目的根目录中,你也有一个.env文件(每个人都用它来节省时间)。该文件包含可在整个项目中使用的变量。

在标准的L5项目中,config/database.php文件中的MySql部分如下:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
        'engine'    => null,
    ],

注意:没有设置端口!

尽管在我的.env文件中已经设置了DB_PORT=33060,但是该值(3306)从未读入到config/database.php中。
因此,不要像我这样做傻事,忘记检查database.php文件。


解决方案
只需将 'port' => env('DB_PORT', 3306), 添加到您的config/database.php文件,并在 .env 文件中设置该值,如下所示:DB_PORT=3306


2
是我忘记了 .env 文件。谢谢! - Webmaster G
8
如若端口号存在,则出现相同问题,我正在使用 Laravel 5。 - 151291
@151291 在我脑海中想到的是:您是否在使用ssh?您是否有.env文件? - nclsvh
3
DB_PORT=33060,您在端口号末尾多加了一个0。 - Mahmoud Kassem
1
@MahmoudAliKassem 是的,这篇帖子已经被编辑了。我没有足够的声望来处理它。 - nclsvh
显示剩余2条评论

43

如果您在Mac OS上使用MAMP,则需要将以下行添加到您的MySQL数据库配置文件中:

'unix_socket' => env('DB_SOCKET', ''),

并且在您的.env文件中添加以下内容:

DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

在Catalina上解决了我的问题。谢谢。 - Ricardo Barbosa
客户正在MAMP上进行测试 - 这是一个巨大的时间节省者 - 谢谢!!! - John
1
对于我(Mac和MAMP),只有这个方法有效。但是非常重要的一点是,在添加了那行代码之后,您应该使用“php artisan optimize”或“php artisan config:cache”来清除缓存。 - Altro
解决了我的问题。 - Prajwal Bati
仍然可以在最新的 MAMP 版本中使用 Laravel 9(2022 年 6 月)。 - abdalmonem

32

.env文件中使用localhost代替127.0.0.1,然后运行命令:

php artisan config:cache

这是我的解决方案。旧密码仍然在旧的.env文件缓存中。 - Ansjovis86
1
当我使用localhost时,出现“找不到文件或目录”的错误。我正在尝试通过SSH连接到远程mysql数据库。 - Giacomo Alzetta
感谢您使用命令:php artisan config:cache。它解决了我的问题。 - Amr
@GiacomoAlzetta,我得到了同样的消息。你不记得怎么解决这个问题了吗?哈哈 - emanoellucas

21

如果你已经在docker上启动了后端和数据库

请将DB_HOST中的localhost或127.0.0.1更改为在docker-compose文件中指示数据库服务名称的已注册服务的名称。

例如,在我的情况下,我将127.0.0.1替换为db,因为在我的docker-compose文件中,我已经将数据库服务的名称定义为db。

我的docker-compose文件大致如下:

services:
    db: <------ This is the name of the DB_HOST
      container_name: admin_db
      image:mysql:5.7.22
    .
    .
    .

18

问题已解决

我遇到同样的问题并通过将.env文件中的DB_HOST常量从127.0.0.1更改为localhost来解决。

只需按照下面一行给出的方式进行操作:

DB_HOST = localhost

不需要更改config/database.php中的任何内容。

别忘了运行

php artisan config:clear


1
我曾经提交了一个PR,为官方Laravel文档添加了一些解释,但他们决定忽略它。链接 - Guo Yunhe
1
有时候这些文件会出问题,所以你需要从这里删除一些文件。/bootstrap/cache/packages.php /bootstrap/cache/services.php /bootstrap/cache/config.php之后运行 php artisan config:clear。 - Vidurajith Darshana
1
php artisan config:clear 命令解决了我在 Azure 上使用 Nginx、Laravel 8 和 PHP 8 时遇到的问题。 - Imran Qamer
1
只是神奇 - CodeToLife

15

如果其他人遇到了类似的问题,还有另一种解决方案。 我所有的设置都是正确的,但由于某些原因我的更改没有更新。 Laravel实际上缓存了配置文件(我觉得这很愚蠢)。

在更新配置后,这是我的解决方案:

php artisan config:clear


1
默认情况下,Laravel 不会缓存配置。你可能已经这样做来加快开发过程中应用程序的速度了吧?请参阅:https://laravel.com/docs/5.5/configuration#configuration-caching - nclsvh
1
在开发环境中,php artisan config:clear 可以解决问题。在生产环境中,你还应该运行 php artisan config:cache,正如 Laravel 在这里建议的:https://laravel.com/docs/8.x/configuration#configuration-caching。 - Amr

10

我遇到了这个问题。当使用Sequel Pro连接时,需要使用端口33060,但在.env文件中必须使用3306。我在.env文件中使用了33060。将其更改为3306后就可以正常工作了。


1
谢谢,这对我有用。奇怪的是,在这个项目之前,我刚刚运行了另一个项目,它在33060上工作,而这个项目确实需要3306。 - Sormano

9

这是一个简单的修复方法。您的mysql数据库已经失去了与服务器的连接。如果您正在运行本地服务器,请在终端中运行以下命令:

mysqld

那将重新连接您的数据库。然后(如果您使用homebrew)运行:
brew services start mysql

这将自动在登录时连接您的数据库。


只是想让SouthernBoy知道,这个帮了我避免了一整天的调试错误! - Arty
我不得不运行brew install mysql。现在它可以工作了,但是我收到了一个不同的错误信息。 - Matt

7
在我的情况下,我在使用docker时遇到了相同的错误,解决方法是在.env文件中设置DB_HOST=db,其中db是运行数据库服务器的容器的名称。

1
对于那些在 Docker/Laradock 的 MySQL 容器上运行代码的用户来说,这是适当的解决方案。DB_HOST 的值等于容器主机名(即 ID),Docker 然后将其转换为正确的网络地址。 - 99linesofcode

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