警告: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
数据库主机错误时,我也遇到了这个错误(尝试交换localhost
和127.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重新启动后出现此错误[重复]