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

Posted

技术标签:

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

我正在尝试使用 Apple(使用 php)上的终端连接到我的 mysql 数据库。

昨天还好好的,现在突然发现标题报错了。

当我使用浏览器运行该脚本时(我安装了 XAMPP),该脚本有效,但终端拒绝连接到数据库。

这是我包含的要连接的文件(当我不包含此文件时脚本可以工作,但它不会连接到数据库):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

应该可以,因为它适用于我的浏览器。

我在终端使用的命令是php scriptname.php

【问题讨论】:

【参考方案1】:

由于某种原因,OS X 上的 mysql 获取所需套接字文件的位置有点错误,但幸运的是,解决方案就像设置符号链接一样简单。

您可能有一个/tmp/mysql.sock/var/mysql/mysql.sock 的套接字(显示为零长度文件),但一个或多个应用程序正在另一个位置寻找它。用这个命令找出来:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

与其移动套接字、编辑配置文件并记住将编辑后的文件保存在本地并远离路径正确的服务器,只需创建一个符号链接,以便您的 Mac 找到所需的套接字,即使它正在查找找错地方了!

如果您有/tmp/mysql.sock 但没有/var/mysql/mysql.sock,那么...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

如果你有/var/mysql/mysql.sock 但没有/tmp/mysql.sock 那么...

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

您将需要创建目录和链接的权限,因此如果需要,只需在上面的命令前加上 sudo。

【讨论】:

好答案。修复对我有用。你知道为什么它可能会工作一次然后就不能再工作吗?我也有同样的问题。 这很老套。我更愿意推荐 @luismreis 的答案来解决 MySQL 隐藏的快捷方式。 对我不起作用...我没有这些文件。但 luismreis 的回答奏效了! 这不是“hacky”。这是使localhost 套接字工作的正确方法,如果您不希望在访问数据库之前将数据包发送到路由器的额外开销,那么它可能很重要。 我的 Ubuntu 10.04 上的路径不正确。我必须这样做:cd /tmp,然后:sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock【参考方案2】:

我也遇到了这个错误,但只能通过here的建议来解决。

总而言之,使用:

127.0.0.1

代替:

localhost

原因是“localhost”是 MySQL 驱动程序的一个特殊名称,使其使用 UNIX 套接字而不是 TCP 套接字连接到 MySQL。

【讨论】:

如果可行,请检查您的hosts 文件,它可能丢失或混乱 也可能值得一提:像我一样使用 MAMP 时,您必须取消选中“仅允许本地访问”框 此解决方案会产生额外的开销,因为数据包首先由路由器发送。测试的时候一般问题不大,但是大数据包的时候可能会出问题。 @Fabrizio 不,它不相关。当您使用 localhost 作为名称时,mysql 将使用 Unix 套接字,而不是通过文件条目(例如 mysql.sock)而不是 Inet 来处理,无论 localhost 是否在 /etc/hosts 中声明。但是,当您改用 IP 地址时,即使是 127.0.0.1,也会强制 mysql 打开 Inet 套接字。 这是否意味着您在 MySQL db 上提供给 'user'%'localhost' 的所有授权都将中断?【参考方案3】:

我遇到了同样的问题,这就是我解决它的方法:

我有这个,但没有用:

$con = mysql_connect('localhost', 'root', '1234');

我这样做了,它奏效了:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

我没有使用 mysql 服务器,而是直接连接到 Unix Socket。为我工作。

【讨论】:

这也是唯一对我有用的解决方案。我没有/var/mysql/mysql.sock。而且我没有/tmp/mysql.sock。 你试过 127.0.0.1 而不是 localhost 吗?【参考方案4】:

MySQL 套接字通常位于/tmp/mysql.sock/var/mysql/mysql.sock,但可能是PHP 找错了位置。

    检查您的套接字在哪里:

     sudo /usr/libexec/locate.updatedb
    

    updatedb 终止时:

     locate mysql.sock
    

    然后找到你的 php.ini:

     php -i | grep php.ini
    

    这将输出如下内容:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
    

    编辑你的 php.ini

     sudo vim /opt/local/etc/php54/php.ini
    

    换行:

     pdo_mysql.default_socket=/tmp/mysql.sock
     mysql.default_socket=/tmp/mysql.sock
     mysqli.default_socket = /tmp/mysql.sock
    

    /tmp/mysql.sock 是您的套接字的路径。

    保存修改并退出 ESC + SHIFT: x

    重启 Apache

     sudo apachectl stop
     sudo apachectl start
    

【讨论】:

我没有 php.ini;我只有一个 php.ini.default,所以这里的解决方法似乎是必要的:apple.stackexchange.com/questions/65802/… 但是,它对我不起作用。 @user124384 您的安装可能已损坏:将您的php.ini.default 重命名为php.ini Apache 可以用一行代码重启:sudo apachectl restart【参考方案5】:

我在 Mac OS X 上使用 XAMPP,Brian Lowe 的上述解决方案稍作修改即可使用

mysql.sock 文件实际上位于“/Applications/xampp/xamppfiles/var/mysql/”文件夹中。所以必须在 /tmp 和 /var/mysql 中链接它。我还没有检查 PHP 命令行使用了哪一个,但这确实解决了问题,所以我很高兴 :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

【讨论】:

ty - 我搜索了几天的解决方案,这是最终解决问题的解决方案! =) OS X 上的 XAMPP 也是【参考方案6】:

Mac OS X EL Capitan + MAMP Pro 这样做

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

然后这样做

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

希望这可以为您节省一些时间。

【讨论】:

它在解决它的/tmp 中链接mysql.dock。谢谢!【参考方案7】:

原因是php找不到mysql.sock的正确路径。

请确保您的 mysql 首先运行。

然后,请确认mysql.sock所在的路径,例如/tmp/mysql.sock

然后将此路径字符串添加到 php.ini:

mysql.default_socket = /tmp/mysql.sock mysqli.default_socket = /tmp/mysql.sock pdo_mysql.default_socket = /tmp/mysql.sock

最后,重启 Apache。

【讨论】:

【参考方案8】:

当您遇到以下问题时:

PHP 抛出错误“警告:mysql_connect() http://function.mysql-connect:2002 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)”

/etc/php.ini 中的“mysql.default_socket”值设置为

 "mysql.default_socket = /var/mysql/mysql.sock". 

然后在服务器管理员中重新启动 Web 服务

【讨论】:

这对我来说是最好的答案 - 在我使用 MAMP 的情况下,我添加到我的 php.ini:mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql。 default_socket = /Applications/MAMP/tmp/mysql/mysql.sock【参考方案9】:

修复迫在眉睫的 2002 套接字错误 - 这是链接 MySQL 放置套接字的位置和 OSX 认为它应该在的位置,MySQL 将它放在 /tmp 和 OSX 在 /var/mysql 中查找它套接字是一种文件类型允许 mysql 客户端/服务器通信。

sudo mkdir /var/mysql

然后

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

来源:http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/

【讨论】:

【参考方案10】:

另一种解决方案是在 php.ini 配置文件中修复套接字位置,如下所示:

pdo_mysql.default_socket=/tmp/mysql.sock

当然,符号链接也可以,所以你改变哪个是一个偏好问题。

【讨论】:

【参考方案11】:

当您使用端口安装 php53-mysql 时,它会返回以下消息,这是该问题的解决方案:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

【讨论】:

我正在使用 Mountain Lion,并且已经使用 macports 安装了 MySQL。【参考方案12】:

我遇到了同样的问题

[PDO异常] SQLSTATE[HY000] [2002] 没有这样的文件或目录

[错误异常] 警告:PDO::__construct(): [2002] ...htdocs/Symfony/vendor/doctrine-dbal/lib/Doctrine 中没有这样的文件或目录(试图通过 unix:///var/mysql/mysql.sock 连接) /DBAL/Driver/PDOConnection.php

所以解决方案是创建一个指向 sock 文件的符号链接,从而解决问题。执行以下操作来解决它:

$ sudo mkdir /private/var/mysql/

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

来源:http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/

【讨论】:

在此处发布您的答案,而不是指向外部网站的链接。【参考方案13】:

我遇到了同样的错误。 在我启动 phpMyAdmin 之前,Mysql 作为独立应用程序运行。

我刚刚停止了mysql 然后 sudo /Applications/XAMPP/xamppfiles/xampp stop sudo /Applications/XAMPP/xamppfiles/xampp start

效果很好

【讨论】:

【参考方案14】:

我刚遇到这个问题,但它只在加载某些页面时出现(其他页面工作正常)。事实证明,在我关闭与mysql_close() 的连接后,我正在调用 MySQL。所以,正如@brucenan 所说:确保调用 MySQL 时它正在运行

【讨论】:

【参考方案15】:

您可以通过简单地在 Apple 终端上为 MAMP php 起别名来实现:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

示例:&gt; phpmamp - v

现在你可以运行类似:&gt; phpmamp scriptname.php

注意:这将仅适用于当前终端会话。

【讨论】:

【参考方案16】:

由于您可能使用 MAMP,请将您的端口更改为默认 3306 或在 database.php 中使用 127.0.0.1

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

或使用默认设置:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

【讨论】:

【参考方案17】:

默认情况下,mySQL 客户端尝试通过称为套接字的本地文件进行连接,而不是连接到 localhost 的环回地址 (127.0.0.1)。

这个套接字文件的默认位置,至少在 OSX 上,是/tmp/mysql.sock

快速,不那么优雅的解决方案

创建一个符号链接来欺骗操作系统找到正确的套接字。

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

正确的解决方案

/Applications/MAMP/bin 中更改startMysql.sh 文件中定义的套接字路径。

【讨论】:

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

php不能连接mysql?提示:Warning: mysql_connect() [function.mysql-connect]: [2002] 由于连接方...

cakephp: 警告 (2): mysql_connect()

警告:mysql_connect():用户'root'@'localhost'的访问被拒绝(使用密码:NO)[重复]

警告:mysql_connect(): 无法通过套接字'/tmp/mysql.sock' (2) 连接到本地 MySQL 服务器

警告:mysql_connect(): php_network_getaddresses: getaddrinfo failed: No such host is known

解决Warning: mysql_connect(): Headers and client library minor version mismatch. 警告