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

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

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


当前回答

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

homestead ssh

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

其他回答

对于任何试图创建一个新的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

} 

希望能有所帮助!

出现这个错误的一个最简单的原因是MySQL服务器没有运行。先验证一下。如果是,继续其他建议:

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文件中的“主机”从“localhost”更改为“127.0.0.1”来解决这个问题。

不知道为什么“localhost”默认不工作,但我在symfony2帖子中找到了一个类似问题的答案。https://stackoverflow.com/a/9251924

更新: 有些人问为什么这个修复工作,所以我对这个主题做了一些研究。似乎他们使用不同的连接类型,解释在这篇文章https://stackoverflow.com/a/9715164

这里出现的问题是“localhost”使用UNIX套接字,无法在标准目录中找到数据库。但是“127.0.0.1”使用TCP(传输控制协议),这本质上意味着它在您的计算机上通过“本地互联网”运行,在这种情况下比UNIX套接字更可靠。

要添加到@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'),
        ]) : [],
    ],

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

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

(__DIR Dotenv:负载 __.'/../');

希望这对大家有所帮助

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