SQLSTATE[HY000] [2002] Laravel homestead 内拒绝连接

SQLSTATE[HY000] [2002] Connection refused within Laravel homestead

使用 Mac OS X 和 Homestead 2.2.1 Laravel 5.2.

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


我已经使用这些 .env 设置

设置了一个 Laravel 项目
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 和 运行ning php artisan 迁移时,我遇到了相同的 SQLSTATE[HY000] [2002] Connection refused 错误。
现在我完全迷路了......

问题

在 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。但是 value (3306) 从未读入 config/database.php.
所以不要像我一样笨,忘记检查 database.php 文件。


修复
只需将 'port' => env('DB_PORT', 3306), 添加到您的 config/database.php 并在 .env 中设置该值,就像这样 DB_PORT=3306

这是一个简单的修复。您的 mysql 数据库已失去与服务器的连接。如果您 运行 在您的终端中 运行 连接本地服务器 运行:

mysqld

这将重新连接您的数据库。然后(如果您使用的是自制软件)运行:

brew services start mysql

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

我遇到了这个问题。当连接 Sequel Pro 时,我需要使用 33060 作为端口,但在 .env 文件中它必须是 3306。我在 .env 文件中有 33060。将其更改为 3306 并且有效。

有可能你的mysql还没有启动或者没有到端口3306

我刚 运行 进入这个,发现在 .env 文件中将其从 127.0.0.1 更改为 localhost 修复了它。

DB_HOST=localhost

在我的例子中,这个错误是突然出现的。在盯着我意识到的那个神秘错误时,我正试图 运行 vm 之外的命令...

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

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

php artisan config:clear

如果您正在使用 Homestead,那么您应该 运行 使用默认的 mysql 端口连接它。因此,您应该在 .env 文件中使用 DB_PORT=3306,而不是使用 DB_PORT=33060。另外,请记住在 homestead 安装中 运行 您的 php artisan migrate 命令,一切都应该没问题。

希望对您有所帮助。

我遇到了同样的问题,试试这个有效

DB_HOST=localhost

如果您在 mac OS 上使用 MAMP,请将以下行添加到您的 mysql 数据库配置文件

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

并在您的 .env 文件中添加

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

使用 localhost 而不是 127.0.0.1(在你的 .env 文件中),然后 运行 命令:

php artisan config:cache

唯一为我解决的是将连接详细信息放在 config/database.php 而不是 中。 env 文件。希望这有帮助

将所有配置放入 .env 文件后,如果您已经 运行 php artisan serveRESTART IT.

我,我在使用 vagrant,但我在框外执行 php artisan 所以基本上它没有权限

我遇到了类似的问题,这里没有任何建议对我有帮助。 这解决了我的问题是将应用程序名称和数据库主机名设置为相同的值。就我而言,127.0.0.1 工作正常。

APP_URL=127.0.0.1

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=zzz
DB_USERNAME=yyy
DB_PASSWORD=XXX

好的,更新看来主机不是问题,实际上是端口。

所以它实际上是端口 3306 用于浏览器测试和终端和 Sequel Pro 33060。会不会跟在Homestead.yaml里面加进去设置这里有什么关系?

在阅读与 Laravel 有关的设置时,它说:

MySQL: 33060 → 转发至 3306

我可能是因为你 很久没有重新启动 PHP artisan

所以在进行数据库更改后 config:clear Tinker 工作正常

但是要使浏览器反映新的数据库连接,您需要重新运行

php artisan serve

  1. 从任务管理器中终止 sqld
  2. 从 xampp 控制面板停止 MySQL 并重新启动

如果它仍然抛出同样的问题,从根文件夹 运行

php artisan cache:clear
php artisan config:cache
php artisan serve
  1. 如果问题仍然存在,请检查您是否正在使用 sql 服务器的多个副本,例如通过 Ubuntu 应用程序,如果是,请停止 MySQL 服务器位于 ubuntu

    sudo 服务MySQL停止

对我来说,将凭据括在引号中就成功了

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE='zzz'
DB_USERNAME='yyy'
DB_PASSWORD='XXX'

我遇到了

SQLSTATE[HY000] [2002] Connection refused (SQL: select * from projects)

原因是我没有启动 MySQL 服务器。

检查 MySQL 是否为 运行 作为解决错误的第一步可能会有所帮助。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=8080
DB_DATABASE=flap_safety
DB_USERNAME=root
DB_PASSWORD=mysql

上面给出的是我的.env

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', 'mysql'),
       // 'port' => env('DB_PORT', '8080'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', 'mysql'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],

上面给出的是我的database.php文件。我刚刚从 database.php 注释掉了端口,它对我有用。

问题已解决

我遇到了同样的问题,只需将 .env 文件中的 DB_HOST 常量从 127.0.0.1 转换为 localhost *JUST DO THIS AS GIVEN IN THE BELOW LINE* DB_HOST = localhost.

即可解决

无需将任何内容更改为 config/database.php

别忘了运行

php artisan config:clear

我发现我的服务器只需要重新启动,"bam"它已修复。

在我的例子中,我在使用 docker 时遇到了同样的错误,诀窍在于在 .env 文件中设置此 DB_HOST=db,其中 db 是容器的名称 运行数据库服务器。

当 Laravel 在 Homestad 盒子上连接到 mysql 并且在本地环境运行ning 命令时:

DB_HOST=127.0.0.1
该应用需要 DB_PORT=3306
迁移需要 DB_PORT=33060 否则会给出 Connection refused
phpunit 需要 DB_PORT=33060 否则给出 Connection refused

DB_HOST=localhost
该应用程序适用于 DB_PORT=3306DB_PORT=33060
迁移不能 运行
phpunit 不能 运行

请记住,phpunit 从 .env.testing 文件(如果存在)中获取其值,否则从应用程序根文件夹中的 phpunit.xml 文件中获取值

如果你像我一样使用 Homestead,请不要忘记在 运行 artisan test 之前通过 ssh 进入它。

如果您的后端和数据库启动于 docker

不要将 localhost 或 127.0.0.1 作为 DB_HOST,而是将指示您的数据库服务的已注册服务的名称放在 docker-compose 文件中。

例如,在我的例子中,我用 db 替换了 127.0.0.1,因为在我的 docker-compose 文件中,我将数据库的服务名称定义为 db

我的 docker-compose 看起来像那样

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

我什至不认为它是 config/database.php。 一旦将我的条目编辑到 .env 文件中,它就开始工作了。

如果您有任何类型的 proxyvpn,请关闭它们。这是我的问题。

在 ubuntu/linux 上,您可以尝试使用以下命令重新启动 mysql:sudo service mysql restart