【问题标题】:PDOException SQLSTATE[HY000] [2002] No such file or directoryPDOException SQLSTATE[HY000] [2002] 没有那个文件或目录
【发布时间】:2022-12-07 03:35:38
【问题描述】:

我相信我已经成功地将我的(非常基本的)站点部署到 fortrabbit,但是当我连接到 SSH 以运行一些命令(例如 php artisan migratephp artisan db:seed)时,我收到一条错误消息:

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

在某些时候,迁移一定成功了,因为我的表就在那里——但这并不能解释为什么它现在对我不起作用。

【问题讨论】:

标签: php mysql laravel database pdo


【解决方案1】:

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

拉维尔 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(传输控制协议),这实际上意味着它通过您计算机上的“本地互联网”运行,在这种情况下比 UNIX 套接字可靠得多。

【讨论】:

  • 奇怪的是,这也是我的解决方案,但我可以从命令行连接 mysql --host=localhost - 可以,但不能从 PDO 连接。
  • 我很想知道为什么 localhost 不起作用而 127.0.0.1 起作用?
  • 这适用于在命令行(终端)上运行 php 文件的 MAMP 系统。它作为网页工作,但在我将 localhost 更改为“127.0.0.1”之前不能作为命令行文件
  • @Justin 我认为这是因为 localhost 尝试使用套接字,而 127.0.0.1 使用 TCP。
  • A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
【解决方案2】:

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

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

【讨论】:

  • 这是我的问题的解决方案,我们公司的一位开发人员不使用 Homestead 并通过套接字连接到 mysql。我删除了我的 app/database.php 文件中的套接字配置。问题解决了
  • 我只需要在 php.ini 中启用 mysqli.so 扩展
  • 我必须将“'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'”添加到 config/database.php
  • 你好社区,我收到这个错误,即使我没有使用 laravel 你能看看这里的问题吗它是stackoverflow.com/questions/60796332/…
  • 当您使用套接字作为 MySQL 端点并且 MySQL 服务根本不运行时,也会发生这种情况。
【解决方案3】:

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

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

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

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

    mysql -u root -p
    
  2. 它会要求您提供相关密码。然后,一旦你得到 mysql 提示符,键入下一个命令:

    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 项目文件夹中,查找数据库.php文件是您配置数据库连接参数的地方。在里面数据库部分在末尾添加下一行:

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

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

【讨论】:

  • 最“直接发布”的解决方案。谢谢,这使我固定在使用 MAMP pro 运行 Laravel
  • 谢谢你。这对我有用。使用 OSX 10.10.5 MAMP 专业版
  • 这对我也适用于 MAMP pro 和 OS X 10.11.x。最后是:/Applications/MAMP/tmp/mysql/mysql.sock
  • +1。正如 Yamartino 在他的回答中所说,在配置中使用“127.0.0.1”而不是“localhost”效果很好,但使用套接字速度更快,这个答案解决了问题。遗憾的是,当定义了 unix_socket 时,mysql 以这种特殊的方式对待“本地主机”......
  • @GregFerrell 是的,这是真的,但是......我希望它有用
【解决方案4】:

由于其他原因,我遇到了 [PDOException] SQLSTATE[HY000] [2002] No such file or directory 错误。我刚刚使用 Apache 2.4.7、PHP v5.5.10 和 MySQL 5.6.16 在 Ubuntu 12.04 上构建了一个全新的 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
  • 这帮助我找到了我的问题——我使用的是 OSX 捆绑的 php,而不是 MAMP php 二进制文件。因此,请确保您使用的是指向正确 php.ini 等的正确版本的 php。片刻。
【解决方案5】:

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

简短回答:将 /app/config/database.php 文件中的“host”从“localhost”更改为“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',但这个答案让我到了那里!
【解决方案6】:

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

sudo service mysqld start

【讨论】:

    【解决方案7】:

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

    homestead ssh
    

    然后简单地 cd 到正确的目录并在那里启动你的命令。

    【讨论】:

    • 这行得通,我是从我的计算机运行命令而不是先通过 ssh 进入 VM,然后在那里运行命令。
    • 我总是忘记这一步。呵呵。 1.source ~/.zshrc 2.homestead up --provision 3.homestead ssh
    • vagrant ssh 以我为例
    【解决方案8】:

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

    【讨论】:

    • 这有效,你是对的。您有什么想法可以解释为什么 localhost 不起作用吗?
    • @Fusion 如果你在容器内运行你的应用程序,它会将“localhost”理解为容器,127.0.0.1 告诉它使用主机的数据库
    • 我也有这样的问题,无法清除缓存或运行 artisan serve
    【解决方案9】:

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

    【讨论】:

      【解决方案10】:

      这是因为 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 上运行良好。

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          基于@dcarrith 的答案...

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

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

          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 容器运行我的应用程序时,我遇到了这个问题。

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

                DB_HOST=db
                

                希望能帮助到你。

                【讨论】:

                • 好的!你救了我的夜 kek :)
                • 如果你在容器中运行 Laravel 应用程序,你需要使用容器凭证。例如。 mysql 公开端口 33333:3306 供 DB_PORT 使用 3306。
                【解决方案16】:

                我只是在 .env 文件中做了一个更改

                我有以下代码行。

                DB_CONNECTION=mysql
                DB_HOST=localhost
                DB_PORT=3306
                DB_DATABASE=database_name
                DB_USERNAME=root
                DB_PASSWORD=
                

                将主机名 localhost 更改为 127.0.0.1

                DB_CONNECTION=mysql
                DB_HOST=127.0.0.1
                DB_PORT=3306
                DB_DATABASE=database_name
                DB_USERNAME=root
                DB_PASSWORD=
                

                这对我来说是可行的,因为找不到像 localhost 这样的主机名

                并在更改主机名后写入以下命令

                php artisan config:clear
                php artisan migrate:install
                php artisan migrate
                

                【讨论】:

                  【解决方案17】:

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

                  就我而言,我将 .env 文件从 DB_HOST=localhost 编辑为 DB_HOST=192.168.10.10,其中 192.168.10.10 是我的 Vagrant/Homestead 主机的 IP。

                  【讨论】:

                    【解决方案18】:

                    仔细检查你的端口。就我而言,它是 8889,而我使用的是 8888。 将“DB_HOST”从“localhost”更改为“127.0.0.1”,反之亦然

                    【讨论】:

                    • 太好了,谢谢,我的端口是 3306 但我的真实端口是 8889
                    【解决方案19】:

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

                    service mysqld restart
                    

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

                    service httpd restart
                    

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

                    【讨论】:

                      【解决方案20】:

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

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

                      DB_HOST=db
                      

                      您还应该确保可以从 php 应用程序中发现您的主机。

                      这是因为 PHP 没有弄清楚要使用哪个主机进行连接。

                      【讨论】:

                      • 这里同样的问题,仍然使用DB_HOST=localhost并在将其更改为DB_HOST=127.0.0.1时得到SQLSTATE[HY000] [2002] No such file or directory,错误更改为SQLSTATE[HY000] [2002] Connection refused。只有当我将它更改为 MySQL docker 容器的名称时,它才开始工作,即:在我的例子中为 DB_HOST=mysql。不确定为什么会这样,当其他答案声称它与套接字有关时,我的猜测是某种回退机制,不正确的检查会引发误导性错误。
                      【解决方案21】:

                      我在使用 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】:

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

                        【讨论】:

                          【解决方案23】:

                          如果你正在使用 Laravel Homestead, 这是设置

                          (包括 Vagrant-虚拟机)

                          .bash 配置文件

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

                          数据库.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
                          

                          【讨论】:

                            【解决方案24】:

                            尝试连接到本地主机:

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

                            尝试连接到 127.0.0.1:

                            SQLSTATE[HY000] [2002] Connection refused
                            

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

                            [mysqld]
                            # skip-networking
                            

                            当然,停止和启动 MySQL 服务器。

                            【讨论】:

                              【解决方案25】:

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

                              【讨论】:

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

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

                              这是我的 /usr/local/etc/my.cnf 配置文件要求的,作为一个 glob 包含 (include /usr/local/etc/my.cnf.d/*.cnf)。

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

                              【讨论】:

                                【解决方案27】:

                                就我而言,当我需要 ssh 进入 vagrant 并从那里运行它时,我在我的 mac 终端上运行 php artisan migrate。希望能帮助某人解决头痛问题。

                                【讨论】:

                                  【解决方案28】:

                                  在我的例子中,我不得不删除 bootstrap/cache 文件夹并重试。

                                  我的场景是在服务器迁移之后。

                                  【讨论】:

                                  • 解决我的问题。我尝试使用 php artisan db:create 创建数据库。虽然就在这个命令之前我有一个数据库,但我需要新的数据库。 ,但我面对。没有影响 mysql 连接的单一更改
                                  【解决方案29】:

                                  解决了

                                  在我的例子中,这是代码中的逻辑问题,连接值在 if 语句中:

                                  if($_SERVER['HTTP_HOST'] == "localhost")
                                  

                                  所以解决方案是添加一个管道并添加 127.0.0.1,这解决了我的问题

                                  if($_SERVER['HTTP_HOST'] == "localhost" || $_SERVER['HTTP_HOST'] == "127.0.0.1")
                                  

                                  【讨论】:

                                    【解决方案30】:

                                    使用 VirtualMachine 时,请确保您通过 ssh 进入该机器并导航到您的 App 文件夹并从那里调用 php artisan migrate 命令。

                                    【讨论】:

                                      猜你喜欢
                                      • 2020-05-07
                                      • 2015-06-24
                                      相关资源
                                      最近更新 更多