警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样

Posted

技术标签:

【中文标题】警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样的文件或目录【英文标题】:Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /private/tmp/wordpress/wp-includes/wp-db.php on line 1452 【发布时间】:2015-12-24 22:07:57 【问题描述】:

我正在尝试运行 phpUnit 来对 WordPress 插件进行单元测试,但标题中的错误不断出现。

我使用 WP-CLI 来设置单元测试,但 WP-CLI 在我尝试运行它时也会引发类似的错误。

我使用 MAMP 运行数据库。

我已将 WP-CLI 和 PHPUnit 设置为 phas,它们在 ~/.bash-profile 中具有别名,并使用 OS X 提供的默认“php”运行。 更改此设置,并使用 MAMP 提供的最新 PHP 版本运行 WP-CLI 和 PHPUnit 修复了 WP-CLI(它正在运行并连接到数据库就好了),但 PHPUnit 仍然抛出相同的错误。

我尝试编辑 wp-config.php 文件,并将主机设置为“:/path/to/mamp/mysql.socket”、“localhost:/path/to/mamp/mysql.socket”和“ 127.0.0.1",这些都没有帮助。

我完全陷入困境,不知道下一步该尝试什么。

【问题讨论】:

可能是 ***.com/q/4219970/1924128 的副本。尤其是***.com/a/32575869/1924128。 Warning: mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in的可能重复 在我的情况下,连接字符串 ***.com/questions/56007265/… 是 Azure 问题 【参考方案1】:

我刚刚遇到此错误 - 您是否检查过您的 wp-config.php 指定的架构是否存在?

在我的情况下,我完全忘记了创建它,所以修复就像 CREATE DATABASE wordpress 一样简单。

wp-config.php 数据库主机错误时,我也遇到了这个错误(尝试交换localhost127.0.0.1)。

【讨论】:

将 localhost 更改为 127.0.0.1 为我做了这件事,非常感谢! 安装 PHP 7.1 后发生,这解决了问题,tx。 更改为 127.0.0.1 不是预期行为。这是一种解决方法。如果您想纠正根本问题,请参阅我的回答。 localhost 更改为 docker 中的服务名称对我有用。【参考方案2】:

首先,确保 MySql 确实在运行。如果进程尚未启动,它不会创建套接字文件。

netstat -tulpn | grep mysql

ps -e | grep mysql

如果 MySql 正在运行,将 wp-config.php 中的数据库主机从 localhost 更改为 127.0.0.1 可以,但这只是一种解决方法。

当您指定localhost 时,mysqli_real_connect() 函数会尝试通过它找不到的 Unix 套接字连接到您的数据库(因此会出现“没有这样的文件”错误。)当您指定 127.0.0.1 时,它会尝试使用默认的 TCP 端口(通常为 3306)连接到您的数据库。

这并不能解决 PHP 不知道在哪里找到您的 MySql 套接字的问题。您需要在php.ini 中配置以下选项。套接字的位置会因您的操作系统而异,但您通常可以通过运行locate mysql.sock 找到它。以下是适用于 CentOS 6.8 的设置。

php.ini

pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock

其他系统常用/tmp/mysqld.sock。可以通过查看MySql配置文件my.cfg来验证配置的位置。

将 PHP 配置为指向正确的套接字位置后,重新启动 Apache/nginx 以便它采用新设置。

现在您可以按预期使用localhost

【讨论】:

这是很好的解释 (+1) 但请允许我批评一下(不是你,只是 mysqli 驱动程序开发人员的决定):“当你指定 localhost 时,mysqli_real_connect() 函数会尝试连接到你的数据库通过无法找到的 Unix 套接字”当我将 localhost 字符串放入我正在处理的应用程序的任何配置中时,我正在考虑将其视为域名。这个域名怎么会变成mysqli_real_connect 内部的神奇字符串,告诉它通过套接字连接?我批评这一点,因为我的问题类似于 OPs 是在 Docker 中使用 MySQL 服务器的结果 @Marecky 你提出了一个很好的问题。然而,这不是 mysql 开发人员的决定,它实际上是一个底层的 Unix 实践。当您指定“localhost”时,它使用本地 Unix 套接字。这种基于文件系统的方法提供了更好的安全性(只能在本地使用)和更好的性能(没有 TCP 开销)。提供任何其他主机名或 IP 地址会进行需要 TCP/IP 的外部调用。这就是 Unix 网络的设计方式。使用 127.0.0.1 会强制您的系统对其自身进行外部调用。这种设计允许您以外部客户端的方式连接到您的服务器。 感谢您对 Linux 工作原理的更多说明,我记得我可能在通过localhost 域名访问服务器时遇到更多问题。现在我知道更多 Linux 软件的情况更广泛。 用户正在使用 MAC,因此netstat 答案不起作用。考虑使用一组不同的options 您好 Nilpo,我已经更新了 php.ini 中的套接字路径并使用了 localhost,但仍然遇到 asme 问题。我在托管 Linux AMI 的 aws ec2 上。你对此有什么想法吗?【参考方案3】:

只需转到您的 phpMyAdmin,单击您的数据库并复制运行服务的 ip 并替换您的 wp-config.php 文件:

/** MySQL 主机名 */ 定义('DB_HOST', 'localhost');

/** MySQL 主机名 */ 定义('DB_HOST', 'ip_where_is_running_mysqlserver');

Replace Localhost to ip of running MySQL Server

【讨论】:

感谢@Gilson Jelembi!你的解决方案对我有用。在我的 Mac 上使用 MAMP 时,我打开了 phpMyAdmin,并在 phpMyAdmin 顶部附近看到了“Server: localhost:8889”文本。然后我在我的wp-config.php 文件中添加了define('DB_HOST', 'localhost:8889');,重新启动了 MAMP,并在浏览器中打开了我的本地 URL,它就可以工作了。【参考方案4】:

这让我很困惑,但我最终解决了。

我的 MySQL 端口是 3308,所以我在

中将“127.0.0.1”更改为“localhost:3308”
$cfg['Servers'][$i]['host'].

有效!

另外,我设置了

$cfg['Servers'][$i]['controluser'] = '';

$cfg['Servers'][$i]['controlpass'] = '';

还有……

$cfg['Servers'][$i]['auth_type'] = 'cookie';

但我认为最关键的是端口更改。

【讨论】:

【参考方案5】:

wp-cli 创建符号以查找更有效,并且消除了编辑许多文件和跟踪wp-config 文件的问题。

我为 MAC Sierra 和 MAMP PRO 做了这个,

使用netstat定位后创建mysql套接字文件的符号链接

netstat -a | grep mysql

var 文件夹中创建文件。

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

WordPress 安装文件夹中的 wp 插件列表工作

/path/to/wordpress/installation $ wp plugin list
-------------------------------------------------+----------+-----------+---------+
| name                                            | status   | update    | version |
+-------------------------------------------------+----------+-----------+---------+
| advanced-custom-fields                          | active   | none      | 5.9.0   |
| akismet                                         | active   | none      | 4.1.6   |
| bbp-voting                                      | inactive | available | 1.3.5   |
| breadcrumb-navxt                                | active   | none      | 6.5.0   |
| contact-form-7                                  | active   | none      | 5.2.2   |
| flamingo                                        | active   | none      | 2.2     |
| keydesign-addon                                 | active   | none      | 3.2     |
| post-my-contact-form-7                          | active   | none      | 4.1.8   |

【讨论】:

【参考方案6】:

在 /wp-includes/wp-db.php 中报告的行(WordPress v 4.5 中的第 1489 行)代码如下:

mysqli_real_connect( $this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

在前面添加@ 即可解决此问题。所以代码应该是:

@mysqli_real_connect( $this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

添加缺少的@,保存并上传修改后的文件,让警告消失。

【讨论】:

这是一个可怕的建议。抑制错误并不能解决问题。那只是把它扫到地毯下。不幸的是,有些开发人员实际上会这样做。 WP 编码出错。如上所述,通过添加缺少的 @ 符号,在以后的 WordPress 版本中已修复此问题。这可以在 v4.7.3 的第 1531 行看到。因此,看起来 WP 开发人员进行了必要的清理以清理错误。 这是第 1540 行。当WP_DEBUG 在 wp-config.php 中设置为 false 时,该行会抑制连接错误,正如在同一个 if 块中它也显示为未抑制的事实所指出的那样。这不是 OP 问题的解决方案。

以上是关于警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样的主要内容,如果未能解决你的问题,请参考以下文章

Mysqli_real_connect():(HY000/1045):用户'root'@'localhost'的访问被拒绝(使用密码:NO)[重复]

mysqli_real_connect(): (HY000/1045): Access denied for user 'phpmyadmin'@'localhost' (使用密码: YES)

mysqli_real_connect(): (HY000/2006): MySQL 服务器已经消失

mysqli_real_connect() 获取 SSL3_GET_SERVER_CERTIFICATE:证书验证失败

从今天起无法通过 XAMPP 连接到本地 MY SQL 数据库 (mysqli_real_connect(): (HY000/2002))

mysqli_real_connect():(HY000/1698):用户'root'@'localhost'的访问被拒绝-我的mac重新启动后出现此错误[重复]