题
我的代码昨天工作得很好,今天它突然不想连接到我的数据库。我没有更改它或代码上的任何设置,也没有更新任何软件。我所做的就是这样:
new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');
我收到一条很好的异常消息:
Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in ...
事情是:我显然不是尝试使用 unix 套接字而是使用 TCP/IP 进行连接。我究竟做错了什么?我在这里缺少什么吗?
谢谢你的帮助。
解决方案
您使用的是Unix套接字。当读取<!>“localhost <!>”时; MySQL客户端库不会将其解释为TCP主机<!>“localhost <!>”;并解析该名称,但使用默认的Socket位置。要在本地计算机上使用TCP,必须使用127.0.0.1
作为主机名。
在DSN中指定过去使用unix_socket
而不是host
。用于localhost
的套接字的位置可以在编译时或在某些版本的PHP中使用pdo_mysql.default_socket
在php.ini
中定义。
其他提示
来自有关使用 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 文件中的更改
在Ubuntu上,您可以在php.ini中使用此设置
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
我刚刚添加了这一行:
'unix_socket' => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',
一切都很顺利。
Drush的文档有更新,此处。