我相信我已经将我的(非常基本的)站点成功部署到了fortrabbit,但是一旦我连接到SSH以运行一些命令(例如php artisan migratephp artisan db:seed),我就会收到一条错误消息:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory


因为我的表在那里,所以迁移一定可以正常进行-但这不能解释为什么它现在对我不起作用。

评论

PHP的可能重复-MySQL连接不起作用:2002没有这样的文件或目录

有时只是因为您尚未安装mysql

#1 楼

错误消息表明尝试了通过套接字的MySQL连接(不支持)。

在Laravel(工匠)的上下文中,您可能想使用其他/正确的环境。例如:php artisan migrate --env=production(或任何环境)。见这里。

评论


这是解决我的问题的方法,我们公司的一名开发人员不使用Homestead,而是通过套接字连接到mysql。我在我的app / database.php文件中删除了套接字配置。问题解决了

– Borislemke
16年1月29日在6:06

我只需要在php.ini中启用mysqli.so扩展名

– Mehulkumar
17年4月23日在9:42

我必须将“'unix_socket'=>'/Applications/MAMP/tmp/mysql/mysql.sock'”添加到config / database.php

–Ángel Carlos del Pozo Muela
18年1月31日在12:23

您好社区,即使我没有使用laravel,我也收到此错误,您可以在这里查看问题是stackoverflow.com/questions/60796332/…

–科兰·帕特尔(Kiran Patel)
3月22日下午5:57

当您使用套接字作为MySQL端点并且MySQL服务根本无法运行时,也会发生这种情况。

–密码
7月12日15:16

#2 楼


Laravel 4:将app/config/database.php文件中的“主机”从“ localhost”更改为“ 127.0.0.1”
Laravel 5+:将.env文件中的“ DB_HOST”从“ localhost”更改为“ 127.0.0.1 “

我遇到了完全相同的问题。以上解决方案均不适用于我。我通过将/app/config/database.php文件中的“主机”从“ localhost”更改为“ 127.0.0.1”解决了该问题。
不确定为什么默认情况下“ localhost”不起作用,但是我在symfony2帖子中解决的类似问题中找到了此答案。 https://stackoverflow.com/a/9251924/1231563
更新:
有人问到此修复程序为什么起作用,因此我对该主题进行了一些研究。似乎他们使用了不同的连接类型,如本帖子中所述https://stackoverflow.com/a/9715164/1231563
这里出现的问题是“ localhost”使用UNIX套接字并且找不到标准目录中的数据库。但是,“ 127.0.0.1”使用TCP(传输控制协议),这实际上意味着它通过计算机上的“本地Internet”运行,在这种情况下,它比UNIX套接字可靠得多。

评论


奇怪的是,它也是我的解决方案,但是我能够从命令行使用mysql --host = localhost连接-可以,但是不能从PDO连接。

–约翰
14年6月23日在17:24

我想知道为什么localhost无法正常工作,而127.0.0.1可以正常工作吗?

–贾斯汀
2014年10月18日,下午2:35

这对我在命令行(终端)上运行php文件的MAMP系统上有效。在我将localhost更改为“ 127.0.0.1”之前,它可以用作网页,但不能用作命令行文件。

–塞缪尔·富尔曼(Samuel Fullman)
2015年1月8日,11:57

@Justin我认为这是因为localhost尝试使用套接字,而127.0.0.1使用TCP。

– Pebbo
15年8月19日在13:32

如果您未指定主机名或指定特殊主机名localhost,则使用Unix套接字文件。 dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html

–x-yuri
16年8月17日在17:22

#3 楼

我遇到了同样的问题,并且我正在运行Mac OS X 10.10 Yosemite。我启用了操作系统随附的Apache服务器和PHP。然后,我刚刚配置了mCrypt库以开始使用。之后,当我使用模型和数据库时,出现错误:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory


我发现的原因仅仅是因为PHP和MySQL无法自身连接。
要解决此问题,请执行以下步骤:



打开终端并使用以下命令连接到mysql:

mysql -u root -p



它将询问您相关的密码。然后,一旦获得mysql promt,请键入以下命令:

mysql> show variables like '%sock%'



您将得到类似以下内容:

+-----------------------------------------+-----------------+
| Variable_name                           | Value           |
+-----------------------------------------+-----------------+
| performance_schema_max_socket_classes   | 10              |
| performance_schema_max_socket_instances | 322             |
| socket                                  | /tmp/mysql.sock |
+-----------------------------------------+-----------------+



保留最后一行的值:

/tmp/mysql.sock



在您的laravel项目文件夹中,查找数据库您可以在.php文件中配置数据库连接参数。在mysql部分的末尾添加下一行:

'unix_socket' => '/tmp/mysql.sock'



您必须具有以下内容:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'SchoolBoard',
        'username'  => 'root',
        'password'  => 'venturaa',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'unix_socket' => '/tmp/mysql.sock',
    ),



现在只需保存更改,然后重新加载页面就可以了!

评论


最“直接发行”的解决方案。谢谢,这使我无法使用MAMP pro运行Laravel

–animaacija
15年6月25日在7:38

谢谢你这对我有用。使用OSX 10.10.5 MAMP Pro

– marknt15
2015年11月5日,下午4:45

这对于MAMP pro和OS X 10.11.x也同样有效。最终是:/Applications/MAMP/tmp/mysql/mysql.sock

–Bort车牌
16年1月20日在4:47

+1。像Yamartino在他的回答中所说的那样,在配置中使用“ 127.0.0.1”代替“ localhost”可以很好地工作,但是使用套接字的速度更快,这个答案解决了这个问题。当定义unix_socket时,mysql以一种特殊的方式对待“ localhost”是很可惜的...

– Shautieh
16-2-20在6:10

@GregFerrell是的,但是很好...我希望它会有用

–alexventuraio
16-2-20在6:37

#4 楼

我由于其他原因遇到了[PDOException] SQLSTATE[HY000] [2002] No such file or directory错误。我刚刚在Ubuntu 12.04上使用Apache 2.4.7,PHP v5.5.10和MySQL 5.6.16构建了一个全新的LAMP堆栈。我将网站移回并解雇了。但是,由于上面的[PDOException],我无法加载基于Laravel 4.2.x的网站。因此,我检查了php -i | grep pdo并注意到以下行:

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


但是,在我的/etc/my.cnf文件中,sock文件实际上位于/var/run/mysqld/mysqld.sock中。

所以,我打开php.ini并设置pdo_mysql.default_socket的值:

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


然后,我重新启动apache并检查php -i | grep pdo

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


为我修复了它。

评论


这是对我有用的修复程序,问题是我安装了两个版本的mysql并删除了一个版本,127.0.0.1的更改不起作用或在配置中添加了袜子,谢谢! @dcarrith

–路易斯
2015年10月27日,下午2:32

这帮助我找到了问题-这是我使用的是OSX捆绑的php,而不是MAMP php二进制文件。因此,请确保您使用的是正确的php版本,该版本指向正确的php.ini等。时刻。

–蜻蜓风格
16年4月5日在18:43

#5 楼

@stuyam的回答对我来说解决了“没有这样的文件或目录”的问题


简短的回答:从“ localhost”更改/app/config/database.php文件中的“主机”改为“ 127.0.0.1”


,但是出现“拒绝连接”错误。如果有人遇到相同的问题,我的解决方案是更新app / config / local / database.php文件,使端口为8889:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),


评论


就我而言,它是'port'=>'33060',但是这个答案使我到了那里!

–mopo922
15年5月16日在22:53

#6 楼

如果您使用的是Laravel Homestead,请确保在服务器上调用命令。

homestead ssh


然后简单地cd到正确的目录并在此执行命令。

评论


这行得通,我从我的计算机而不是ssh首先运行命令到VM并在其中运行命令。

– cmac
16年12月21日在16:00

我总是忘记这一步。嘿。 1.来源​​〜/ .zshrc 2. homestead up --provision 3. homestead ssh

–马塞尔
17年2月9日在2:58

在我的情况下流浪的SSH

– Marcos Curvello
18-10-18在15:54

#7 楼

就我而言,我一点问题都没有,只是忘了启动mysql服务...

sudo service mysqld start


#8 楼

在.env文件中从DB_HOST=localhost更改为DB_HOST=127.0.0.1后,它起作用了

评论


这行得通,您是对的。您是否有任何想法解释为什么localhost不起作用?

–融合
19年6月27日在7:08

@Fusion如果您在容器中运行应用程序,它将理解为“ localhost”作为容器,127.0.0.1告诉它使用主机的数据库

–死亡皇帝
19-10-3在8:59

我也遇到了这样的问题,无法清除缓存或运行手工艺品服务

–汤姆·姆文达(Tom Mwenda)
1月2日7:53

#9 楼

Mamp用户启用选项允许网络访问MYSQL



#10 楼

像下面的示例一样在database.php文件中添加mysql.sock路径

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',


示例

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),


#11 楼

这是因为PDO特别对待“ localhost”主机:


注意:仅Unix:当主机名设置为“ localhost”时,与服务器的
连接为通过域套接字。如果PDO_MYSQL是针对libmysqlclient编译的,则套接字文件的位置位于libmysqlclient编译的位置。如果PDO_MYSQL是针对mysqlnd编译的,则可以通过
pdo_mysql.default_socket设置来设置默认套接字。


(来自http://php.net/manual /en/ref.pdo-mysql.connection.php)

将localhost更改为127.0.0.1将“强制”使用TCP。

注意:mysqli_connect运行正常与localhost。

#12 楼

以@dcarrith的答案为基础...

我没有编辑配置文件,而是在PHP查找的位置创建了一个别名,该别名连接到真实的mysql.sock。 (源)

只需运行这两个命令(无需重新启动):

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


#13 楼

步骤1
找到您的unix_socket的路径,只需运行netstat -ln | grep mysql

你应该得到类似的东西
unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

步骤2
将其添加您的unix_socket参数
'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

希望对您有所帮助!

#14 楼

我在MAMP Pro上运行,并且在尝试迁移(创建数据库表)时遇到了类似的问题。也尝试了其中一些提到的建议,但没有为我做。

因此,简单地(在一个小时的搜索之后),我在/config/database.php中添加了两件事。

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'


工作正常现在!

#15 楼

使用Docker容器运行应用程序时遇到了这个问题。

该解决方案在DB_HOST的docker_compose.yml中放入了我正在使用的MySQL服务容器的名称。就我而言,是db

DB_HOST=db


希望有帮助。

评论


真好!你救了我的夜猫:)

–СтасПишевский
8月18日23:19

如果您在容器中运行Laravel应用,则需要使用容器凭据。例如。 mysql在DB_PORT使用3306中公开端口33333:3306。

–СтасПишевский
8月18日23:22

#16 楼

仔细检查您的端口。在我的情况下是8889,我正在使用8888。
将“ DB_HOST”从“ localhost”更改为“ 127.0.0.1”,反之亦然

评论


太好了,谢谢,我的端口是3306,但我的真实端口是8889

–大卫
4月26日10:16

#17 楼

我在访问Drupal网站时遇到类似的问题。我通过打开命令行并重新启动MySQL服务器或服务来修复它:

service mysqld restart


这应该可以工作。如果没有,请重新启动本地Web服务器:

service httpd restart


就足够了。希望它也适用于其他环境。请注意,这些命令通常需要超级用户特权。

#18 楼

在Elixir / Gulp和Homestead作为我的Vagrant环境中运行PHPUnit时,我遇到了这个问题。

我将.env文件从DB_HOST=localhost修改为DB_HOST=192.168.10.10,其中192.168.10.10是我的Vagrant /的IP宅基地主持人。

#19 楼

从Laravel 5开始,数据库用户名和密码进入项目目录中存在的.env文件,例如,

DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1


您可以看到这些环境变量覆盖了'伪造'字符串在这里,因此更改它们无效:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],


更多信息在这里https://mattstauffer.co/blog/laravel-5.0-environment-detection和环境变量

#20 楼

尝试连接到本地主机:

SQLSTATE[HY000] [2002] No such file or directory


尝试连接到127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused


好,只需注释/从my.cnf(在OS X 10.5:/opt/local/etc/mysqlxx/my.cnf上)中删除以下设置即可:

[mysqld]
# skip-networking


当然,停止并启动MySQL Server。

#21 楼

如果使用Laravel Homestead,
这是设置

(包括Vagrant虚拟机)

.bash-profile

alias vm="ssh vagrant@127.0.0.1 -p 2222"


database.php

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'homestead'),
        'username'  => env('DB_USERNAME', 'homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],


vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install


#22 楼

如果仍然有人在寻找答案,只需检查您的.env文件。出于某种原因,laravel创建了一个.env.example文件,所以所有这些答案对我来说都不起作用。我修复了将.env.example重命名为.env
的问题

评论


这个问题没有一个正确的答案,因为可能会发生各种错误。这是其中之一,因为无法将.env文件复制到远程服务器。因此,值得在尝试运行查询的服务器上检查.env文件,以确保它既存在又包含建立连接所需的信息。

–petercoles
16-2-9在10:26



#23 楼

这发生在我身上,因为MySQL没有运行。 MySQL无法启动,因为我缺少/usr/local/etc/my.cnf.d/目录。

我的/usr/local/etc/my.cnf配置文件要求将其作为全局包含(include /usr/local/etc/my.cnf.d/*.cnf)。

运行mkdir /usr/local/etc/my.cnf.d和然后启动MySQL,解决了该问题。

#24 楼

就我而言,当我需要ssh进入流浪汉并从那里运行它时,我在我的mac终端上运行php artisan migration。希望可以帮助别人头痛。

#25 楼

我在docker_compose.yml文件中使用Docker和MySQL服务名称db时遇到了相同的问题:

我在.env文件中添加了以下内容:

DB_HOST=db


还应该确保可以从php应用程序中找到主机。

这是因为PHP无法确定要使用哪个主机进行连接。

#26 楼

使用虚拟机时,请确保将ssh插入该计算机并导航至您的App文件夹,然后从此处调用php artisan migration命令。

#27 楼

在可能的情况下,我只是使用

vagrant up


homestead up


进行伪造幼体设置使用宅基地。我假设这意味着该站点已得到服务,但从未启动MySQL服务器。当我使用后一个命令启动我的无业游民的盒子时,错误消失了。

#28 楼

所有这些答案似乎都很繁琐...

我刚刚创建了一个.env文件;编辑了我的bootstrap/app.php文件,并取消了以下行的注释...

Dotenv::load(__DIR__.'/../');

希望对别人有帮助

#29 楼

对于试图在laravel上而不是在laravel上创建新的db连接的任何人,这里碰到了寻求从终端运行PDO的答案。这将对您有所帮助。您可以对其进行重构以使其最适合您。

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run shell command to get 
           $socks = shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 


希望对您有所帮助!

#30 楼

就我而言,我必须删除bootstrap / cache文件夹,然后再试一次。

我的情况是在服务器迁移之后。