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();
}
?>
我一直在使用 postman 测试连接是否正常,但我一直收到此错误消息:
Connection failed: SQLSTATE[HY000] [2002] Connection refused
在我收到以下错误消息之前:
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
这是因为我将服务器名设置为本地主机,通过将其更改为 IP 地址,它给我的连接被拒绝,我不知道出了什么问题。
如有任何帮助,我们将不胜感激。
我找到连接不通的原因,是因为连接试图连接到端口8888,当它需要连接到端口8889时。
$conn = new PDO("mysql:host=$servername;port=8889;dbname=AppDatabase", $username, $password);
这解决了问题,尽管将服务器名称更改为 localhost 仍然会出现错误。
连接失败:SQLSTATE[HY000] [2002] 没有那个文件或目录
但是当服务器名称输入IP地址时连接成功
在我的例子中 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
Note : In latest Ubuntu version now initctl is replaced by systemctl
使用 MAMP,我将 host=localhost
更改为 host=127.0.0.1
。但是新问题来了"connection refused"
通过将 'port' => '8889'
放在 'Datasources' => [
中解决了这个问题
对我来说,php 版本来自 mac 而不是 MAMP,.bash_profile 上的 PATH 变量是错误的。我只是将 MAMP PHP bin 文件夹添加到 $PATH 环境变量中。对我来说是:
/Applications/mampstack-7.1.21-0/php/bin
在终端运行vim ~/.bash_profile
打开~/.bash_profile
键入 i 以编辑文件,将 bin 目录作为 PATH 变量添加到文件顶部:
export PATH="/Applications/mampstack-7.1.21-0/php/bin/:$PATH"
点击 ESC
,输入 :wq
,然后点击 Enter
- 在终端中 运行
source ~/.bash_profile
- 在终端类型
which php
中,输出应该是 MAMP PHP 安装的路径。
在 Mac 上使用 MAMP,我通过重命名
解决了我的问题
/Applications/MAMP/tmp/mysql/mysql.sock.lock
至
/Applications/MAMP/tmp/mysql/mysql.sock
对于还在为拒绝连接而苦恼的所有人,这是我的建议。下载 XAMPP 或其他类似软件并启动 MySQL。您不必 运行 apache 或其他东西,只需 MySQL.
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 的上下文中,如果主机名在证书中用作 CN(通用名称),我也看到了使用 IP 地址而不是主机名进行连接时的错误。
我在 php:8.0-fpm-alpine
图像的 docker 容器上遇到了同样的问题。我刚刚在 Dockerfile 中添加了以下行并解决了问题:
RUN apk add mysql-client
我正在尝试使用 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();
}
?>
我一直在使用 postman 测试连接是否正常,但我一直收到此错误消息:
Connection failed: SQLSTATE[HY000] [2002] Connection refused
在我收到以下错误消息之前:
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
这是因为我将服务器名设置为本地主机,通过将其更改为 IP 地址,它给我的连接被拒绝,我不知道出了什么问题。
如有任何帮助,我们将不胜感激。
我找到连接不通的原因,是因为连接试图连接到端口8888,当它需要连接到端口8889时。
$conn = new PDO("mysql:host=$servername;port=8889;dbname=AppDatabase", $username, $password);
这解决了问题,尽管将服务器名称更改为 localhost 仍然会出现错误。
连接失败:SQLSTATE[HY000] [2002] 没有那个文件或目录
但是当服务器名称输入IP地址时连接成功
在我的例子中 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
Note : In latest Ubuntu version now initctl is replaced by systemctl
使用 MAMP,我将 host=localhost
更改为 host=127.0.0.1
。但是新问题来了"connection refused"
通过将 'port' => '8889'
放在 'Datasources' => [
对我来说,php 版本来自 mac 而不是 MAMP,.bash_profile 上的 PATH 变量是错误的。我只是将 MAMP PHP bin 文件夹添加到 $PATH 环境变量中。对我来说是:
/Applications/mampstack-7.1.21-0/php/bin
在终端运行
vim ~/.bash_profile
打开~/.bash_profile
键入 i 以编辑文件,将 bin 目录作为 PATH 变量添加到文件顶部:
export PATH="/Applications/mampstack-7.1.21-0/php/bin/:$PATH"
点击
ESC
,输入:wq
,然后点击Enter
- 在终端中 运行
source ~/.bash_profile
- 在终端类型
which php
中,输出应该是 MAMP PHP 安装的路径。
在 Mac 上使用 MAMP,我通过重命名
解决了我的问题/Applications/MAMP/tmp/mysql/mysql.sock.lock
至
/Applications/MAMP/tmp/mysql/mysql.sock
对于还在为拒绝连接而苦恼的所有人,这是我的建议。下载 XAMPP 或其他类似软件并启动 MySQL。您不必 运行 apache 或其他东西,只需 MySQL.
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 的上下文中,如果主机名在证书中用作 CN(通用名称),我也看到了使用 IP 地址而不是主机名进行连接时的错误。
我在 php:8.0-fpm-alpine
图像的 docker 容器上遇到了同样的问题。我刚刚在 Dockerfile 中添加了以下行并解决了问题:
RUN apk add mysql-client