警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

Posted

技术标签:

【中文标题】警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)【英文标题】:Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in 【发布时间】:2010-12-21 15:12:07 【问题描述】:

我的代码昨天工作正常,今天突然不想连接到我的数据库。我没有更改它或代码上的设置,也没有更新任何软件。我所做的就是:

new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');

我收到一条很好的异常消息:

...

问题是:我显然不是尝试使用 unix 套接字连接,而是使用 TCP/IP。我究竟做错了什么?我这里有什么遗漏吗?

感谢您的帮助。

【问题讨论】:

你确认你的mysql服务器正在运行吗? 相关/欺骗:Warning: mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in 【参考方案1】:

您正在使用 Unix 套接字。读取“localhost”时,MySQL 客户端库不会将其解释为 TCP 主机“localhost”并解析该名称,而是使用默认的 Socket 位置。要在本地计算机上使用 TCP,您必须使用 127.0.0.1 作为主机名。

要指定过去,请在 DSN 中使用 unix_socket 而不是 host。用于localhost 的套接字的位置可以在编译时或在某些 php 版本中使用pdo_mysql.default_socket 中的php.ini 定义。

【讨论】:

但是没有办法禁用它吗?我的意思是,它和昨天一样工作。以及如何启用服务器上的套接字以使其正常工作? 我在配置文件中使用了“localhost”的 PHP 脚本,在 RAM 升级和重启后,它们在从控制台触发时停止工作——仍然在浏览器中工作。将 'localhost' 更改为 '127.0.0.1' 修复了它。 似乎这已停止工作。使用 127.0.0.1 似乎仍然默认使用套接字。 这很烦人,多年来以不同的名义遇到过这个问题,我总是忘记这个挑剔的人,并花费大量时间寻找解决方案。如果 host == 'localhost' 使用套接字的“设计决定”对我来说似乎是绝对垃圾。【参考方案2】:

来自关于使用 PDO 连接到 MySQL 的 PHP 文档:PDO_MYSQL DNS

最后的注释说:

仅适用于 Unix:

当主机名设置为“localhost”时,则连接到 服务器是通过域套接字制作的。如果 PDO_MYSQL 是针对 libmysql 那么套接字文件的位置在 libmysql 的 在位置编译。如果 PDO_MYSQL 是针对 mysqlnd 编译的 默认套接字可以通过 pdo_mysql.default_socket 设置来设置。

因此,为了解决这个问题,您必须在 php.ini 中正确配置 mysql.sock 的位置

    找到你的 mysql.sock 文件。常见位置:

    /tmp/mysql.sock /tmp/mysql/mysql.sock /var/mysql/mysql.sock 或者,如果您使用 MAMP 或 LAMP,请在 tmp 文件夹中查找 mysql

    编辑您的 php.ini 文件并正确设置 pdo_mysql.default_socket 的值

    重新启动 Apache 服务器以获取 php.ini 文件中的更改

【讨论】:

【参考方案3】:

在 Ubuntu 上,您可以在 php.ini 中使用此设置

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

【讨论】:

【参考方案4】:

Drush 的文档有更新,记录在 here。

【讨论】:

【参考方案5】:

我刚刚添加了这一行:

'unix_socket'   => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',

一切都很好。

【讨论】:

你在哪里添加了这一行?

以上是关于警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)的主要内容,如果未能解决你的问题,请参考以下文章

PDO::__construct(): 发送 108 字节失败,errno=32 Broken pipe

PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告

PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告

PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename or servname provided, or

PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to

[PDOException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed: