【问题标题】:Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /private/tmp/wordpress/wp-includes/wp-db.php on line 1452警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样的文件或目录
【发布时间】: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",这些都没有帮助。

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

【问题讨论】:

标签: php mysql wordpress mysqli mysql-connect


【解决方案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 问题的解决方案。
      猜你喜欢
      • 2017-06-12
      • 2017-07-13
      • 1970-01-01
      • 2021-01-09
      • 2019-07-27
      相关资源
      最近更新 更多