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


PHP Connection failed: SQLSTATE[HY000] [2002] Connection refused

我正在尝试使用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地址,连接被拒绝,我不知道出了什么问题。

如有任何帮助,我们将不胜感激。

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

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

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

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

但是,当为服务器名称输入IP地址时,它会成功连接。

我在docker环境中度过了相当长的几个小时,其中我的所有容器都是docker容器,并且我使用Phinx进行迁移。只是为了用不同的配置共享不同的响应。

工作解决方案

"host" => "db", // {docker container's name} Worked
"host" => "172.22.112.1", // {some docker IP through ipconfig - may change on every instance - usually something like 172.x.x.x} Worked

非工作解决方案

"host" => "127.0.0.1", // SQLSTATE[HY000] [2002] Connection refused
"host" => "docker.host.internal", //  SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
"host" => "localhost", //  SQLSTATE[HY000] [2002] No such file or directory

我用以下方式运行Phinx

docker compose --env-file .env run --rm phinx status -e development

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

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

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

$ 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取代

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

通过将'port' => '8889'放入'Datasources' => [

1来解决此问题。服务器证书验证标志

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

如果没有它,服务器上的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的上下文中,我还看到了使用IP地址而不是主机名进行连接时的错误,如果主机名在证书中用作CN(通用名)。

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

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

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

对我来说,是来自mac的php版本,而不是MAMP,.bash_profile上的PATH变量是错误的。我只是在$PATH-env变量之前准备了MAMP PHP bin文件夹。对我来说是:

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

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

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

  3. 命中ESC,键入:wq,然后命中Enter

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

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

RUN apk add mysql-client

我曾经遇到过类似的问题,结果发现数据库中的用户是用类似的东西创建的:

CREATE USER 'webpage'@'localhost' IDENTIFIED BY 'password';

当连接细节php脚本有localhost时工作正常,但当IP地址在那里时工作不正常。快速交换(在连接详细信息中创建用户和本地主机时的ip地址)揭示了这两件事必须匹配。

对于所有仍在为拒绝连接而烦恼的人,以下是我的建议。下载XAMPP或其他类似的软件,然后启动MySQL。你不需要运行apache或其他东西,只需要运行MySQL。