【问题标题】:Laravel 7 database host ignored?Laravel 7 数据库主机被忽略?
【发布时间】:2021-08-20 17:02:16
【问题描述】:

我目前设置了多个基于域加载的 env 文件。 每个都有自己的设置,包括数据库。 数据库主机是共享的。在本例中为 127.0.0.0 或 localhost

我现在决定搬到 docker,所以现在主机是“db”,但它不会工作。问题似乎是主机被忽略了。

在我的 .env 中,我有以下内容:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=my-db
DB_USERNAME=my-db-user
DB_PASSWORD=my-db-password

在文件 vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php 中有这个方法:

    protected function createPdoConnection($dsn, $username, $password, $options)
    {
        if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
            return new PDOConnection($dsn, $username, $password, $options);
        }

        return new PDO($dsn, $username, $password, $options);
    }

当我试图弄清楚发生了什么时,我修改了这个:

    protected function createPdoConnection($dsn, $username, $password, $options)
    {
        echo '<pre>';
        var_dump($dsn);
        var_dump($username);
        var_dump($password);
        var_dump($options);
        var_dump(env('DB_CONNECTION'));
        var_dump(env('DB_HOST'));
        var_dump(env('DB_PORT'));
        var_dump(env('DB_DATABASE'));
        var_dump(env('DB_USERNAME'));
        var_dump(env('DB_PASSWORD'));
        exit;
        if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
            return new PDOConnection($dsn, $username, $password, $options);
        }

        return new PDO($dsn, $username, $password, $options);
    }

结果如下:

string(54) "mysql:host=127.0.0.1;port=3306;dbname=my-db"
string(11) "my-db-user"
string(32) "my-db-password"
array(5) {
  [8]=>
  int(0)
  [3]=>
  int(2)
  [11]=>
  int(0)
  [17]=>
  bool(false)
  [20]=>
  bool(false)
}
string(5) "mysql"
string(2) "db"
string(4) "3306"
string(7) "my-db"
string(7) "my-db-user"
string(64) "my-db-password"

这表明正在加载环境文件,正确的变量存在但 dns 主机是“host=127.0.0.1”,现在如果我像这样修改文件:

    protected function createPdoConnection($dsn, $username, $password, $options)
    {
        $dsn = str_replace('127.0.0.1', env('DB_HOST'), $dsn);
        if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
            return new PDOConnection($dsn, $username, $password, $options);
        }

        return new PDO($dsn, $username, $password, $options);
    }

这些网站的工作很明显 laravel 要么不使用 DB_HOST 要么正在对它做些什么,或者是 laravel PHP docker+mySQL docker 的组合?

有人见过这种行为吗?

在我的 docker 文件下面

FROM local:php-7.2
WORKDIR /var/www
RUN groupadd -g 1000 www-data
RUN useradd -u 1000 -ms /bin/bash -g www-data www-data
RUN chown www-data:www-data /var/www
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
USER www-data
RUN export DB_HOST=db
EXPOSE 9000
CMD ["php-fpm"]

【问题讨论】:

  • 请记住,env 在生产模式下不可用。您是否将 .env 添加到您的 docker 文件中?它是一个隐藏文件,所以它可能在复制时跳过了它
  • 相关设置在 config/database.php 中。通常这是从 .env 填充的,但如果有人在那里硬编码“127.0.0.1”(并删除了 env())调用,这将解释这种行为。
  • @TobiasK。事实并非如此,该值不是硬编码的。
  • @MaartenDev 问题不是环境,但是您对环境在生产模式下不可用的评论帮助我找到了实际问题。事实证明我没有设置环境 APP_CONFIG_CACHE 所以所有站点最终都共享相同的路径,该路径具有旧的配置文件。为每个站点设置正确的 APP_CONFIG_CACHE 解决了这个问题。

标签: laravel docker


【解决方案1】:

显示你的 docker 文件。 你可以试试这个: DB_HOST=docker_container_name

【讨论】:

  • 我已经添加了 docker 文件,并且 DB_HOST=docker_container_name,其中 docker_container_name 对我来说是“db”没有工作。
  • 你的 docker-compose.yml 文件在哪里?给我看看你的数据库容器文件。
猜你喜欢
  • 2018-02-08
  • 2014-11-10
  • 2013-07-20
  • 2013-09-11
  • 2020-12-25
  • 2017-04-12
  • 1970-01-01
  • 2012-03-11
  • 2021-09-29
相关资源
最近更新 更多