【发布时间】: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 解决了这个问题。