Symfony,Doctrine,Configuration和Symfony Cache

时间:2018-02-04 20:30:57

标签: php symfony doctrine-orm symfony-cache

我有一个Symfony应用程序,它为许多数据库共享相同的代码库。

这很典型,我的应用程序的每个“实例”(或“帐户”)都有一个数据库,这是一个简单的医疗约会工具。我需要按原样保留这种架构。

但是,我们正在从Symfony 2.8迁移到Symfony 4.在Symfony 4之前,我必须为每个数据库创建一个“伪prod”Symfony环境,因为Symfony(带有Doctrine)与指定单个DB非常相关通过配置,甚至使用像SYMFONY__DATABASE__NAME这样的env变量,数据库连接属性被硬编码到缓存中,因此我需要为每个应用程序实例创建不同的环境,因此为每个帐户创建缓存目录,这远非理想。

Symfony 4的新环境变量功能是否会以“原生”方式使动态数据库连接更加可行?

我应该使用其他方法来实现这一目标吗? (例如,创建自定义连接工厂等)

我想为我的prod环境设置一个缓存,并让连接参数动态化。

任何想法都赞赏。谢谢!

注意:

这不是:Using Relationships with Multiple Entity Managers

的副本

我已经在使用多个实体管理器,它与此无关。

1 个答案:

答案 0 :(得分:2)

使用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变量,项目的基本名称或标识每个主机的一些其他信息,并将其附加到{{中定义的缓存基目录1}}。默认情况下,它看起来像这样:

getCacheDir

您也可以使用Symfony内置的缓存组件来代替每个主机指定不同的public function getCacheDir(): string { return dirname(__DIR__).'/var/cache/'.$this->environment; } 。这样,您可以重用负责缓存容器,注释,验证等的系统缓存。

您可以在app.cache下的config/packages/framework.yml中找到缓存配置。请参阅:https://speakerdeck.com/dbrumann/caching-in-symfony-an-overview?slide=37