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

我相信我已经成功地将我的(非常基本的)站点部署到fortrabbit,但只要我连接到SSH运行一些命令(如php artisan migratephp artisan db:seed),我就会得到一个错误消息:

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

在某种程度上,迁移一定是有效的,因为我的表在那里——但这并不能解释为什么它现在不适合我。

684422 次浏览

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

在Laravel (artisan)环境中,您可能需要使用不同/正确的环境。例如:php artisan migrate --env=production(或任何环境)。看到在这里

由于其他原因,我遇到了[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堆栈。我把我的网站搬了回来,重新启动。但是,我无法加载我的Laravel 4.2。基于x的站点,因为上面的[PDOException]。因此,我检查了php -i | grep pdo,并注意到这一行:

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

但是,在我的/etc/my.cnf中,袜子文件实际上在/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

这为我解决了问题。

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

Laravel 5 +:更改“db_host”;在.env文件中的"localhost"“;127.0.0.1"

我也有同样的问题。以上的方法对我来说都没用。我通过改变“host”来解决这个问题。在/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(传输控制协议),这本质上意味着它通过“本地互联网”运行。在这种情况下,您的计算机比UNIX套接字更可靠。

在我的情况下,我没有任何问题,只是忘记启动mysql服务…

sudo service mysqld start

基于@dcarrith的回答…

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

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

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

来自@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'    => '',
),

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

homestead ssh

然后简单地cd到正确的目录并在那里发出命令。

我遇到了同样的问题,我运行的是Mac OS X 10.10 Yosemite。我已经启用了操作系统自带的Apache服务器和PHP。然后,我刚刚配置了mCrypt库开始。在那之后,当我使用模型和DB时,我得到了一个错误:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
我发现的原因只是因为PHP和MySQL不能自己连接。 为了解决这个问题,我遵循以下步骤:

  1. 打开终端连接mysql:

    mysql -u root -p
    
  2. It will ask you for the related password. Then once you get the mysql promt type the next command:

    mysql> show variables like '%sock%'
    
  3. You will get something like this:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Keep the value of the last row:

    /tmp/mysql.sock
    
  5. In your laravel project folder, look for the database.php file there is where you configure the DB connection parameters. In the mysql section add the next line at the end:

    'unix_socket' => '/tmp/mysql.sock'
    
  6. You must have something like this:

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

Now just save changes, and reload the page and it must work!

在Laravel 5中,数据库用户名和密码保存在项目目录中的.env文件中,例如。

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

正如你所看到的,这些环境变量覆盖了这里的“forge”字符串,所以改变它们没有任何影响:

    '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

当使用VirtualMachine时,确保你ssh到那台机器,导航到你的App文件夹,并从那里调用php artisan migrate命令。

如果你使用Laravel Homestead, 这里是settings

(包括流浪者-虚拟机)

.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

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

service mysqld restart

这应该有用。如果没有,重启你的本地web服务器:

service httpd restart

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

我在MAMP Pro上运行,在尝试迁移(创建db表)时遇到了类似的问题。我也尝试了上面提到的一些建议,但对我来说并不奏效。

因此,简单地(在谷歌了一个小时后),我向/config/database.php添加了两个东西。

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

现在工作很好!

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

vagrant up

而不是

homestead up

为了我的熔炉幼虫装置。我假设这意味着站点正在得到服务,但MySQL服务器从未启动过。当我使用后一个命令启动我的流浪者盒子时,错误消失了。

我在Elixir/Gulp和Homestead中运行PHPUnit时遇到了这个问题。

在我的例子中,我将.env文件从DB_HOST=localhost编辑到DB_HOST=192.168.10.10,其中192.168.10.10是我的Vagrant/Homestead主机的IP。

尝试连接到本地主机:

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

如果有人还在寻找答案,只要检查你的。env文件。出于某种原因,laravel创建了一个。env。示例文件,所以所有这些答案都不适合我。我修复了重命名。env的问题。.env的示例

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

enter image description here

所有这些答案似乎都很沉重……

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

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

希望这对大家有所帮助

添加mysql。袜子路径在database.php文件如下示例

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

这发生在我身上是因为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,解决了这个问题。

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

希望能有所帮助!!

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

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

注意:仅适用于Unix:当主机名设置为“localhost”时,则 到服务器的连接是通过域套接字进行的。如果PDO_MYSQL是 根据libmysqlclient编译后的套接字文件的位置 在libmysqlclient的编译位置。如果编译PDO_MYSQL mysqlnd的默认套接字可以通过 pdo_mysql.default_socket设置。< / p >

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

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

注意:mysqli_connect与localhost一起工作很好。

在我的例子中,我在我的mac终端上运行php artisan migrate,当我需要ssh进入vagrant并从那里运行它时。希望这能帮助缓解头痛。

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

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

解决方案是把我在docker_compose.yml中使用的MySQL服务容器的名称放在DB_HOST上。在我的例子中,它是db:

DB_HOST=db

希望能有所帮助。

对于任何试图创建一个新的db连接而不是在laravel上,而是在这里寻找从终端运行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


}

希望能有所帮助!

在我的情况下,我不得不删除引导/缓存文件夹,然后再试一次。

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

我的答案是针对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文件中的默认连接指向正确的凭据,模型仍然使用我从本地环境文件中删除的远程数据库连接配置。

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

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

DB_HOST=db

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

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

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

首先打开终端,进入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',
),

现在只需保存更改,并重新加载页面,它就工作了。

我只是在。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

解决了

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

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

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

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

要添加到@alexventuraio的解决方案中,如果你在Laravel 5.8上遇到这个问题,你可能想要替换数据库配置文件中'unix_socket'的值,如下:

 'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
// 'unix_socket' =>'/var/run/mysqld/mysqld.sock',
'unix_socket' => env('DB_SOCKET', ''), // replace with this line, so you can always add the mysqld.sock from the dotenv file
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
所有现有的答案都是正确的,可能对你有用。 我的情况有点不同。当我在本地使用docker-compose up启动一个docker项目时遇到了这个错误

我的具体情况的问题是,我从一子文件夹运行docker-compose up,而不是在docker-compose文件所在的根文件夹中运行。

确保从docker-compose.yml保存到的文件夹中运行docker-compose up !

检查您的MySQL服务器是否正在运行,如果数据库连接配置正确。