我有一个Symfony应用程序,它为许多数据库共享相同的代码库。
这是非常典型的,我的应用程序的每个"实例"(或"帐户")都有一个数据库,这是一个简单的医疗预约工具。我需要保持这个架构不变。
但是,我们正在从Symfony 2.8迁移到Symfony 4。在 Symfony 4 之前,我必须为每个数据库创建一个"伪生产"的 Symfony 环境,因为 Symfony(带有 Doctrine)与配置指定的单个数据库密切相关,即使使用 env var 如 SYMFONY__DATABASE__NAME,数据库连接属性也会硬编码到缓存中,所以我需要为每个应用程序实例创建一个不同的环境, 因此,为每个帐户创建一个缓存目录,这远非理想。
来自Symfony 4的新env vars功能是否会以"本机"方式使动态数据库连接更加可行?
我应该使用另一种方法来实现这一目标吗?(例如,创建自定义连接工厂等)
我希望为我的生产环境使用单个缓存,并让连接参数是动态的。
任何想法都值得赞赏。谢谢!
注意:
这不是以下内容的副本: 使用与多个实体经理的关系
我已经在使用多个实体管理器,与此无关。
使用Symfony 4为不同的主机设置应用程序应该是简单的。您可以将DATABASE_URL
作为环境变量提供给每个主机,例如使用 nginx:
server {
server_name domain.tld www.domain.tld;
root /var/www/project/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(/|$) {
fastcgi_pass unix:/var/run/php7.1-fpm.sock;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name";
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ .php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
导入位fastcgi_param DATABASE_URL ...
。
默认情况下,所有实例都将使用相同的缓存目录,这可能不是您想要的。假设客户 A 看到客户 B 的数据,因为它是从缓存中提取的,B 首先访问了它。
解决此问题的一种方法是修改src/Kernel.php
以考虑其他一些 env 变量、项目的基本名称或标识每个主机的其他一些信息,并将其附加到getCacheDir
中定义的缓存基目录。默认情况下,它看起来像这样:
public function getCacheDir(): string
{
return dirname(__DIR__).'/var/cache/'.$this->environment;
}
你也可以使用Symfony的内置缓存组件来为每个主机指定不同的app.cache
。这样,您可以重用负责缓存容器、注释、验证等的系统缓存。
您可以在config/packages/framework.yml
的framework.cache
下找到缓存配置。请参阅:https://speakerdeck.com/dbrumann/caching-in-symfony-an-overview?slide=37