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

时间:2010-11-18 21:53:43

标签: php mysql database

我正在尝试使用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

17 个答案:

答案 0 :(得分:412)

由于某些原因,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命令。

答案 1 :(得分:358)

我也遇到了这个错误,但只能通过建议here修复它。

总结一下,使用:

127.0.0.1

而不是:

localhost

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

答案 2 :(得分:23)

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

我有这个并且它不起作用:

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

我做到了这一点并且有效:

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

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

答案 3 :(得分:21)

MySQL套接字通常位于/tmp/mysql.sock/var/mysql/mysql.sock中,但可能PHP查找错误的位置。

  1. 检查套接字的位置:

     sudo /usr/libexec/locate.updatedb
    
  2. 当updatedb终止时:

     locate mysql.sock
    
  3. 然后找到你的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
    
  4. 编辑你的php.ini

     sudo vim /opt/local/etc/php54/php.ini
    
  5. 更改行:

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

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

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

  7. 重启Apache

     sudo apachectl stop
     sudo apachectl start
    

答案 4 :(得分:11)

我在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

答案 5 :(得分:10)

Mac OS X EL Capitan + MAMP Pro 这样做

tac <file> | sed -n '/ENTRY/q;p' | tac

然后这样做

p

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

答案 6 :(得分:6)

原因是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。

答案 7 :(得分:6)

当您遇到以下问题时:

  

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服务

答案 8 :(得分:2)

修复迫在眉睫的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/

答案 9 :(得分:1)

当您使用port安装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

答案 10 :(得分:1)

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

pdo_mysql.default_socket=/tmp/mysql.sock

当然,符号链接也有效,所以你需要更改哪一个。

答案 11 :(得分:1)

我遇到了同样的问题

<强> [PDOException] SQLSTATE [HY000] [2002]没有这样的文件或目录

<强> [ErrorException] 警告:PDO :: __ construct():[2002]没有这样的文件或目录(试图通过unix:///var/mysql/mysql.sock连接)... htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine /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/

答案 12 :(得分:0)

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

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

工作正常

答案 13 :(得分:0)

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

答案 14 :(得分:0)

你可以通过简单地在Apple终端上混淆MAMP php来实现它:

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

示例:> phpmamp - v

现在您可以运行类似:> phpmamp scriptname.php

的内容

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

答案 15 :(得分:0)

由于您可能使用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
    );

答案 16 :(得分:0)

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

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

快速,简便的解决方案

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

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

正确的解决方案

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