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

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

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


当前回答

这是因为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一起工作很好。

其他回答

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

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

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

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

在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

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

service mysqld restart

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

service httpd restart

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