【问题标题】:PHP Connection failed: SQLSTATE[HY000] [2002] Connection refusedPHP 连接失败:SQLSTATE[HY000] [2002] 连接被拒绝
【发布时间】:2015-06-06 09:00:13
【问题描述】:

我正在尝试使用 PHP 连接来连接 phpmyadmin 上的 MySQL 数据库。只是想看看连接是否成功,连接并没有什么花哨的。我正在使用 MAMP 来托管数据库,我尝试使用的连接是这样的:

<?php
$servername = "127.0.0.1";
$username = "root";
$password = "root";

try {
    $conn = new PDO("mysql:host=$servername;dbname=AppDatabase", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
}
catch(PDOException $e)
{
    echo "Connection failed: " . $e->getMessage();
}
?>

我一直在使用邮递员测试连接是否正常,但我不断收到此错误消息:

连接失败:SQLSTATE[HY000] [2002] 连接被拒绝

在我收到以下错误消息之前:

连接失败:SQLSTATE[HY000] [2002] 没有这样的文件或目录

这是因为我将服务器名称设置为 localhost,通过将其更改为 IP 地址,它给了我连接被拒绝,我不知道出了什么问题。

我们将不胜感激。

【问题讨论】:

  • 听起来你的 MySQL 服务没有监听 127.0.0.1 TCP。如果它实际上正在运行,则可能是它位于本地套接字上,而不是 TCP。 mysql:localhost;dbname=AppDatabase 有影响吗?
  • ... 还是 localhost 出现“没有这样的文件或目录”?如果是这种情况,要么是 php.ini 中的套接字路径不正确,要么是 MySQL 根本没有运行。
  • 如果其他人出于同样的原因遇到此问题,对我来说,问题是我在代码中犯了一个错误,导致我使用错误的主机名登录到数据库.
  • 您可能会因为 MySQL 的磁盘空间不足而收到相同的错误。如果您在 Ubuntu 上,请检查磁盘空间 $ df -h

标签: php mysql pdo


【解决方案1】:

我找到了连接不工作的原因,是因为连接试图连接到端口 8888,而它需要连接到端口 8889。

$conn = new PDO("mysql:host=$servername;port=8889;dbname=AppDatabase", $username, $password); 

这解决了问题,尽管将服务器名称更改为 localhost 仍然会出现错误。

连接失败:SQLSTATE[HY000] [2002] 没有这样的文件或目录

但是输入服务器名的IP地址后连接成功。

【讨论】:

  • 尝试执行ping localhost 以查看它是否 ping 到环回地址。可能是您的主机文件已损坏。使用主机名上的 IP 无论如何都会提供小的性能提升
  • 你是如何找到正确的端口的?默认情况下不是本地主机端口8080吗?当你使用 tcp 协议时,这种情况会改变吗?
  • 我相信这与ipv6有关。我的主机 localhost 解析为::1,所以我怀疑底层的 mysql 客户端不支持 ipv6(即使是本地地址)。将其更改为 127.0.0.1 为我解决了问题,就像答案的最后一行所暗示的那样。
  • 我在使用 Laradock.io (Laravel 8) 时收到了同样的错误消息,但是我需要更新它以使用我的真实 IP 地址来解决它。我猜是因为代码访问是在 docker 容器内完成的。
【解决方案2】:

在我的情况下,MySQL 服务器没有运行。我重新启动了 MySQL 服务器,问题得到解决。

//on ubuntu server
sudo /etc/init.d/mysql start

为避免 MySQL 停止问题,您可以使用 Ubuntu 14.04 LTS Linux 中的“initctl”实用程序来确保服务在出现故障或重新启动时重新启动。请考虑在执行此操作以保留数据之前谈论根卷的快照(mysql 已停止)[8]。您可以使用以下命令来管理带有“initctl”实用程序的 mysql 服务以及停止和启动操作。

$ sudo initctl stop mysql
$ sudo initctl start mysql

为了验证工作,您可以检查服务的状态并获取 进程ID(pid),通过杀死“mysql”来模拟失败 进程并在之后验证其状态为使用新进程 ID 运行 有时(通常在 1 分钟内)使用以下命令。

$ sudo initctl status mysql         # get pid
$ sudo kill -9 <pid>                # kill mysql process
$ sudo initctl status mysql         # verify status as running after sometime

注意:在最新的 Ubuntu 版本中,现在 initctl 被 systemctl 取代

【讨论】:

    【解决方案3】:

    使用 MAMP,我将 host=localhost 更改为 host=127.0.0.1。但是出现了一个新问题“连接被拒绝”

    通过将'port' =&gt; '8889' 放入'Datasources' =&gt; [ 解决了这个问题

    【讨论】:

      【解决方案4】:

      在 Mac 上使用 MAMP,我通过重命名解决了我的问题

      /Applications/MAMP/tmp/mysql/mysql.sock.lock
      

      /Applications/MAMP/tmp/mysql/mysql.sock
      

      【讨论】:

        【解决方案5】:

        对我来说是 mac 的 php 版本而不是 MAMP,.bash_profile 上的 PATH 变量是错误的。我只是将 MAMP PHP bin 文件夹添加到 $PATH 环境变量中。对我来说是:

        /Applications/mampstack-7.1.21-0/php/bin
        
        1. 在终端运行vim ~/.bash_profile打开~/.bash_profile

        2. 键入 i 以便能够编辑文件,将 bin 目录作为 PATH 变量添加到文件的顶部:

          export PATH="/Applications/mampstack-7.1.21-0/php/bin/:$PATH"

        3. 点击ESC,输入:wq,然后点击Enter

        4. 在终端运行source ~/.bash_profile
        5. 在终端类型 which php 中,输出应该是 MAMP PHP 安装的路径。

        【讨论】:

          【解决方案6】:

          1.服务器证书验证标志

          我需要使用 SSL 进行连接,除了 CA 文件的条目 PDO::MYSQL_ATTR_SSL_CA 之外,还需要在 new PDO 选项数组中将 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 设置为 false。

          没有它,服务器上的mysql日志有帮助地提到

          2021-07-27 17:02:51 597605 [Warning] Aborted connection 597605 to db: 'unconnected' user: 'unauthenticated' host: '192.168.10.123' (This connection closed normally without authentication)
          

          我肯定在 DSN 中传递了正确的数据库和用户名等。一个空的选项数组至少在错误日志中显示数据库和用户。我确信这些事情有正当的技术原因。
          我正在添加此信息,以便下次访问此页面时可以更轻松地找到它..

          2.连接字符串中的主机

          在 SSL 的上下文中,如果主机名在证书中用作 CN(公用名),我也看到使用 IP 地址而不是主机名进行连接时出现错误。

          【讨论】:

            【解决方案7】:

            我在来自php:8.0-fpm-alpine 图像的 docker 容器上遇到了同样的问题。我刚刚在 Dockerfile 中添加了以下行,它解决了这个问题:

            RUN apk add mysql-client
            

            【讨论】:

              【解决方案8】:

              如果你还在为拒绝连接而苦苦挣扎,这里是我的建议。下载 XAMPP 或其他类似的软件,然后启动 MySQL。您不必运行 apache 或其他东西,只需运行 MySQL。

              【讨论】:

              • 安装另一个软件如何解决给定的问题?如果出现同样的问题并且已经安装了 XAMPP 怎么办?
              猜你喜欢
              • 2021-07-10
              • 1970-01-01
              • 2017-05-04
              • 2020-01-22
              • 2020-04-24
              • 2017-09-20
              • 2020-03-26
              相关资源
              最近更新 更多