警告:mysqli_real_connect():(HY000/2002):在/private/tmp/wordpress/wp-includes/wp-db.php的第1452行找不到文件或目录。

11
我试图使用PHPUnit对WordPress插件进行单元测试,但是标题中的错误一直出现。
我使用WP-CLI设置了单元测试,但是当我尝试运行时,WP-CLI也会抛出类似的错误。
我使用MAMP来运行数据库。
我已经将WP-CLI和PHPUnit设置为phar,并在~/.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",但都没有帮助。
我完全被卡住了,不知道下一步该怎么办。

1
可能是 https://dev59.com/P2855IYBdhLWcg3wp2J0 的重复。特别参考 https://dev59.com/P2855IYBdhLWcg3wp2J0#32575869。 - J.D.
在我的情况下,这是Azure连接字符串问题。https://stackoverflow.com/questions/56007265/how-to-use-mysql-connection-string-inside-php-code-which-is-served-by-azure-luni/56007385#56007385 - Shady Mohamed Sherif
7个回答

27

我刚遇到了这个错误 - 你是否检查了wp-config.php文件指定的schema是否存在?

在我的情况下,我完全忘记创建它,所以解决方法就是简单的CREATE DATABASE wordpress

另外,当wp-config.php文件中数据库主机名错误时,我也遇到过此错误(尝试交换localhost和127.0.0.1)。


7
将本地主机更改为127.0.0.1对我有用,非常感谢! - MrHunter
安装了 PHP 7.1 后发生的问题,这解决了问题,谢谢。 - Octal
更改为127.0.0.1不是预期的行为,而是一种解决方法。如果您想要纠正潜在问题,请查看我的答案。 - Nilpo
将Docker中的localhost更改为服务名称对我有效。 - Ramin Firooz

14

首先,请确保 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内部的神奇字符串,告诉它通过套接字连接?我批评这一点,因为我遇到的问题与OP类似,都是使用Docker中的MySQL服务器导致的。 - Marecky
1
@Marecky 你提出了一个好问题。然而,这并不是mysql开发人员的决定,它实际上是一个底层Unix实践。当你指定“localhost”时,它使用本地的Unix套接字。这种基于文件系统的方法提供了更好的安全性(只能在本地使用)和更好的性能(没有TCP开销)。提供任何其他主机名或IP地址将进行需要TCP/IP的外部调用。这就是Unix网络设计的工作方式。使用127.0.0.1会强制系统向自身进行外部调用。这种设计允许你以外部客户端的方式连接到服务器。 - Nilpo
1
感谢更详细地解释Linux的工作原理,我记得我可能会在使用“localhost”域名访问服务器时遇到更多问题。现在我知道这是涉及更多Linux软件的广泛情况。 - Marecky
用户正在使用MAC,因此netstat命令无法使用。考虑使用不同的选项集。 - pensebien
嗨Nilpo,我已经在php.ini中更新了套接字路径并使用本地主机,但仍然遇到相同的问题。我正在使用AWS EC2托管Linux AMI。你有任何想法吗? - Arpita Hunka

2

请前往phpMyAdmin,点击您的数据库,复制运行服务的ip,并替换wp-config.php文件中的内容:

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

/** MySQL主机名 */ define('DB_HOST', '运行MySQL服务器的IP地址');

将localhost替换为正在运行的MySQL服务器的IP地址


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

0

我使用的是Mac,并且在本地环境中使用MAMP。我尝试了上面分享的解决方案,将localhost更改为127.0.0.1,但对我没有起作用。

我使用MAMP的默认端口(8888/8889),而不是80/3306。

此外,我按照第二个答案检查了mySQL sock文件,但设置正确。

最后,对我有用的解决方案如下:

我在wp-config.php文件中用127.0.0.1:8889替换了localhost

感谢Jeff编写了this article提供的解决方案。


0

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

我的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';

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


0

创建符号链接以供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文件夹中返回插件列表

/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   |

-5
在报告的行/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 );

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


6
这是糟糕的建议。压制错误并不能解决问题,这只是把它藏起来而已。很遗憾会有开发人员真的这样做。 - Nilpo
WP编码中出现了错误。这个问题在后来的WordPress版本中通过添加上述缺失的@符号得到了修复。这可以在v4.7.3的第1531行看到。因此,看起来WP开发人员已经采取必要的措施来清理这个错误。 - MissionNext
这是第1540行。当wp-config.php中的WP_DEBUG设置为false时,该行抑制连接错误,因为它在同一if块中也未被抑制。这不是OP问题的解决方案。 - Nilpo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接