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

时间:2013-12-21 21:34:25

标签: php mysql laravel pdo

我相信我已成功将我的(非常基本的)网站部署到fortrabbit,但是一旦我连接到SSH以运行某些命令(例如php artisan migratephp artisan db:seed),我就会得到一个错误讯息:

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

在某些时候,迁移必须有效,因为我的桌子在那里 - 但这并不能解释为什么它现在不适合我。

32 个答案:

答案 0 :(得分:562)

  

Laravel 4:app/config/database.php文件中的“host”从“localhost”更改为“127.0.0.1”

     

Laravel 5:.env文件中的“DB_HOST”从“localhost”更改为“127.0.0.1”

我遇到了完全相同的问题。上述解决方案均不适合我。我通过将/app/config/database.php文件中的“host”从“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套接字更可靠。

答案 1 :(得分:112)

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

在Laravel(工匠)的背景下,您可能想要使用不同的/正确的环境。例如:php artisan migrate --env=production(或任何环境)。请参阅here

答案 2 :(得分:76)

我遇到了同样的问题,我正在运行Mac OS X 10.10 Yosemite。我启用了操作系统附带的Apache Server和PHP。然后我只是配置了mCrypt库来开始。之后,当我使用模型和DB时,我得到了错误:

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

我找到的原因仅仅是因为PHP和MySQL无法自己连接。 为了解决这个问题,我按照以下步骤操作:

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

    mysql -u root -p
    
  2. 它会询问您相关的密码。然后,一旦你获得了mysql promt,就输入下一个命令:

    mysql> show variables like '%sock%'
    
  3. 你会得到这样的东西:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. 保留最后一行的值:

    /tmp/mysql.sock
    
  5. laravel项目文件夹中,查找 database.php 文件,您可以在其中配置数据库连接参数。在 mysql 部分中添加最后一行:

    'unix_socket' => '/tmp/mysql.sock'
    
  6. 你必须有这样的东西:

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),
    
  7. 现在只需保存更改,然后重新加载页面即可正常工作!

答案 3 :(得分:45)

由于其他原因,我遇到了[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

为我修好了。

答案 4 :(得分:40)

@stuyam的回答解决了#34;没有这样的文件或目录&#34;问题对我来说

  

简短回答:改变&#34;主持人&#34;在&#34; localhost&#34;的/app/config/database.php文件中到&#34; 127.0.0.1&#34;

然后我有一个&#34;连接被拒绝&#34;错误。如果有人有同样的问题,我的解决方案是更新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'    => '',
    ),

答案 5 :(得分:22)

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

homestead ssh

然后只需cd到正确的目录并在那里激活你的命令。

答案 6 :(得分:16)

在我的情况下我完全没有问题,只是忘了启动mysql服务......

sudo service mysqld start

答案 7 :(得分:16)

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

enter image description here

答案 8 :(得分:14)

在database.php文件中添加mysql.sock路径,如下例

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

Eample

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

答案 9 :(得分:12)

这是因为PDO对待&#34; localhost&#34;特别主持:

  

注意:仅限Unix:当主机名设置为&#34; localhost&#34;时,则   通过域套接字连接到服务器。如果是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将&#34;强制&#34;使用TCP。

注意:mysqli_connect与localhost一起工作正常。

答案 10 :(得分:11)

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

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

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

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

答案 11 :(得分:11)

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

答案 12 :(得分:10)

第1步

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

即可

你应该得到这样的东西

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

第2步

将其添加到 unix_socket param

'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' <-----
            ),
        ),

希望它有所帮助!!

答案 13 :(得分:7)

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

所以,简单地说(在一小时谷歌搜索后),我在/config/database.php中添加了两件事。

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

现在工作正常!

答案 14 :(得分:3)

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

答案 15 :(得分:2)

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

在我的情况下,我将.env文件从DB_HOST=localhost编辑为DB_HOST=192.168.10.10,其中192.168.10.10是我的Vagrant / Homestead主机的IP。

答案 16 :(得分:2)

尝试连接到localhost:

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

答案 17 :(得分:2)

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

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

正如您所看到的,这些环境变量正在覆盖&#39;伪造&#39;这里的字符串如此改变它们没有效果:

    '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-and-environment-variables

答案 18 :(得分:1)

在我的情况下,我在我的mac终端上运行php artisan migrate,当我需要ssh到vagrant并从那里运行它。希望能帮助别人头疼。

答案 19 :(得分:1)

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

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

DB_HOST=db

希望有帮助。

答案 20 :(得分:1)

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

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

DB_HOST=db

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

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

答案 21 :(得分:1)

我在使用 nginx 的 ubuntu 18.04 中遇到了同样的问题。通过执行以下步骤,我的问题已得到解决:

首先打开终端并进入mysql CLI。要检查 mysql 套接字位置,我编写了以下命令。

mysql> show variables like '%sock%'

我得到了如下内容:

+-----------------------------------------+-----------------------------+
| Variable_name                           | Value                       |
+-----------------------------------------+-----------------------------+
| mysqlx_socket                           | /var/run/mysqld/mysqlx.sock |
| performance_schema_max_socket_classes   | 10                          |
| performance_schema_max_socket_instances | -1                          |
| socket                                  | /var/run/mysqld/mysqld.sock |
+-----------------------------------------+-----------------------------+
4 rows in set (0.00 sec)

在 laravel 项目文件夹中,在 config 文件夹中查找 database.php 文件。在mysql部分我根据上表修改了unix_socket。

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'database'  => 'database_name',
        'username'  => 'username',
        'password'  => 'password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'unix_socket' => '/var/run/mysqld/mysqld.sock',
    ),

现在只需保存更改,然后重新加载页面即可。

答案 22 :(得分:1)

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

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

运行mkdir /usr/local/etc/my.cnf.d,然后启动MySQL,修复了问题。

答案 23 :(得分:1)

如果有人仍在寻找答案,请检查您的.env文件。出于某种原因,laravel会创建一个.env.example文件,因此所有这些答案都不适用于我。我修复了我的问题,将.env.example重命名为.env

答案 24 :(得分:1)

如果您使用的是Laravel Homestead, 这是设置

(包括Vagrant-Virtual Machine)

<强> .bash轮廓

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

答案 25 :(得分:0)

所有这些答案似乎都很重要......

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

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

希望这有助于某人

答案 26 :(得分:0)

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

vagrant up

而不是

homestead up

我使用宅基地进行伪造幼虫设置。我假设这意味着该网站正在服务,但MySQL服务器还没有启动。当我使用后一个命令启动我的流浪盒时,错误就消失了。

答案 27 :(得分:0)

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

service mysqld restart

这应该有效。如果没有,请重新启动本地网络服务器:

service httpd restart

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

答案 28 :(得分:0)

对于试图在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

} 

希望有帮助!

答案 29 :(得分:0)

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

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

答案 30 :(得分:0)

我的回答是针对Laravel的。

database.php配置文件中创建到本地Docker MySQL服务的新连接并将其设置为默认连接后,出现了此消息。我忘记了通过在模型中覆盖它来设置其他连接:

class Model extends \Illuminate\Database\Eloquent\Model
{
    protected $connection;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->connection = 'some_other_connection';
    }
...

因此,即使我在database.php文件中的默认连接指向正确的凭据,该模型仍在使用从本地环境文件中删除的远程数据库连接配置。

答案 31 :(得分:0)

使用VirtualMachine时,请确保将ssh插入该计算机并导航到App文件夹并从那里调用php artisan migrate命令。