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


246

我正在尝试使用Apple上的Terminal(使用PHP)连接到MySQL数据库。

昨天工作正常,现在突然出现标题错误。

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

这是我要连接的文件(当我不包含该文件时,脚本便起作用了,但随后它没有连接至数据库):

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

应该可以,因为它可以与我的浏览器一起使用。

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

Answers:


415

由于某种原因,OS X上的mysql弄错了所需套接字文件的位置,但是值得庆幸的是,解决方案就像设置符号链接一样简单。

您可能有一个套接字(显示为零长度文件),其名称为/tmp/mysql.sock/var/mysql/mysql.sock,但是一个或多个应用正在其他位置寻找它。用以下命令找出:

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

无需移动套接字,编辑配置文件,并且必须记住将编辑后的文件保留在本地且远离路径正确的服务器,只需创建一个符号链接即可,即使Mac放在错误的位置,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前缀即可。


好答案。Fix对我有用。您知道为什么它可能一次只能工作然后又不能再次工作吗?我有同样的问题。
妮可

16
这很hacky。我宁愿推荐@luismreis的答案来解决该MySQL隐藏的快捷方式。
MattiSG

2
没有为我工作...我没有任何这些文件。但是luismreis的答案奏效了!
格雷戈尔2012年

4
这不是“ hacky”。这是使localhost套接字正常工作的正确方法,如果您不希望在访问数据库之前将数据包发送到路由器而产生额外的开销,那么这可能很重要。
Kebman

1
我的Ubuntu 10.04上的路径不正确。我必须这样做:cd /tmp然后:sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock
franzlorenzon 2013年

370

我也有过这样的错误,但只能解决它通过的建议在这里

总结一下,使用:

127.0.0.1

代替:

localhost

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


1
如果hosts
Fabrizio

3
也许也要提一下:当像我一样使用MAMP时,您必须取消选中“仅允许本地访问”框
soupdiver 2013年

由于数据包首先由路由器发送,因此该解决方案产生了额外的开销。通常在测试时不是大问题,但对于大数据包可能会成为问题。
Kebman

3
@Fabrizio不,没有关系。当您使用localhost作为名称时,无论是否在/ etc / hosts中声明了localhost,mysql都会使用Unix套接字而不是通过文件条目(例如mysql.sock)而不是Inet的套接字处理。但是,当您改用ip地址(甚至127.0.0.1)时,则强制mysql打开一个Inet套接字。
Fran Marzoa 2014年

1
那么,这是否意味着您在MySQL数据库上提供给'user'%'localhost'的所有授予都将中断?
章鱼

24

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

我有这个,但是没有用:

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

我做到了,它奏效了:

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

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


这也是唯一对我有用的解决方案。我没有/var/mysql/mysql.sock。而且我没有/tmp/mysql.sock。
JeffB6688

您是否尝试使用127.0.0.1而不是localhost?
Mantisse

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

我没有php.ini;我只有php.ini.default,因此看来这里的解决方法是必需的:apple.stackexchange.com/questions/65802/… 但是,它对我不起作用。
user124384

@ user124384您的安装可能已损坏:将您重命名php.ini.defaultphp.ini
名词

可以单行重新启动Apache:sudo apachectl restart
fbiazi '18

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

1
ty-我搜寻了几天的解决方案,而这终于使事情变得正确了!=)也是OS X上的XAMPP
ljubiccica 2014年

10

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

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


它链接mysql.dock/tmp是解决它。谢谢!
Mohammed J. Razem

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。


6

当您遇到以下问题时:

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

将“ mysql.default_socket”值设置/etc/php.ini

 "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
Adamski


1

另一个解决方案是像这样修复php.ini配置文件中的套接字位置:

pdo_mysql.default_socket=/tmp/mysql.sock

当然,符号链接也可以工作,因此您可以更改它的优先级。


1

当您使用端口安装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。
Sheric

1

我有同样的问题

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

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

因此,解决方案是对袜子文件建立符号链接,从而解决该问题。请执行以下操作解决该问题:

$ 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/


在此处发布您的答案,而不是发布到外部网站的链接。
ElmerCat

0

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

我只是停止了mysql然后sudo / Applications / XAMPP / xamppfiles / xampp停止sudo / Applications / XAMPP / xamppfiles / xampp start

工作正常


0

我只是遇到了这个问题,但是它仅在加载某些页面时出现(其他页面工作正常)。原来,我与断开连接后正在对MySQL进行调用mysql_close()。因此,正如@brucenan所说:调用MySQL时,请确保它正在运行


0

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

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

例: > phpmamp - v

现在,您可以运行以下内容: > phpmamp scriptname.php

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


0

由于您可能会使用MAMP,因此请将Port更改为默认值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
    );

0

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

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

快速,简便的解决方案

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

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

正确的解决方案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.