Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony、条令、配置和Symfony缓存_Php_Symfony_Doctrine Orm_Symfony Cache - Fatal编程技术网

Php Symfony、条令、配置和Symfony缓存

Php Symfony、条令、配置和Symfony缓存,php,symfony,doctrine-orm,symfony-cache,Php,Symfony,Doctrine Orm,Symfony Cache,我有一个Symfony应用程序,它为许多数据库共享相同的代码库 这很典型,我的应用程序的每个“实例”(或“帐户”)都有一个数据库,这是一个简单的医疗预约工具。我需要保持这个架构的原样 但是,我们正在从Symfony 2.8迁移到Symfony 4。在Symfony 4之前,我必须为每个数据库创建一个“pseudo prod”Symfony环境,因为Symfony(带条令)非常依赖于由配置指定一个数据库,甚至使用像Symfony______;DATABASE____;NAME这样的环境变量,数据库

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

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

但是,我们正在从Symfony 2.8迁移到Symfony 4。在Symfony 4之前,我必须为每个数据库创建一个“pseudo prod”Symfony环境,因为Symfony(带条令)非常依赖于由配置指定一个数据库,甚至使用像Symfony______;DATABASE____;NAME这样的环境变量,数据库连接属性也会硬编码到缓存中,因此,我需要为每个应用程序实例创建不同的环境,从而为每个帐户创建缓存目录,这远远不够理想

Symfony 4的新env vars功能是否会使动态数据库连接以“本机”方式更为可行

我应该用另一种方法来实现这一点吗?(例如,创建自定义连接工厂等)

我希望我的prod环境有一个单一的缓存,并让连接参数是动态的

任何想法都值得赞赏。谢谢

注:

这不是以下内容的副本:


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

使用Symfony 4为不同的主机设置应用程序应该很简单。您可以将
数据库\u 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\u param数据库\u URL…

默认情况下,所有实例都将使用相同的缓存目录,这可能不是您想要的。假设客户A看到客户B的数据,因为它是从缓存中提取的,B首先访问它

解决此问题的一种方法是修改
src/Kernel.php
,将其他一些环境变量、项目的基本名称或其他一些标识每个主机的信息考虑在内,并将其附加到
getCacheDir
中定义的缓存基本目录中。默认情况下,它如下所示:

public function getCacheDir(): string
{
    return dirname(__DIR__).'/var/cache/'.$this->environment;
}
您还可以使用Symfony的内置缓存组件为每个主机指定不同的
app.cache
s。通过这种方式,您可以重用负责缓存容器、注释、验证等的系统缓存


您可以在
framework.cache
下的
config/packages/framework.yml
中找到缓存配置。请参阅:

谢谢,我读到了,但我几乎看不到这种模式(“数据库托管2”)是“动态的”,我没有一个“客户”,如果我有超过50个数据库怎么办?我是否必须为每个数据库添加一个实体管理器,即database_host3和database_host4?所有这些值都硬编码到缓存中,这使我无法为所有数据库提供单一的缓存环境。3.2中引入的env速记法能否解决这个问题(
“密码:”%env(DB\u密码)%“
)?您需要为应用程序使用的每个数据库添加一个连接,以便Dority连接到它。如果您对多个应用程序使用单独的环境,则可以通过这种方式将它们分开。
实体无法定义不同实体管理器之间的关联。如果您需要,有几种替代方法ves需要一些自定义设置。
可能重复的是,我明白了,我实际上使用了两个实体管理器,一个用于我的客户数据,这取决于其子域(比如:johndoe.myapp.com),一个用于一些共享数据,所以我有两个EMs,一个用于“myapp_共享”DB,另一个用于“johndoe_数据”“DB。问题是,DB连接数据被硬编码到缓存中,这在我看来是胡说八道,因为它迫使我每个DB有一个缓存目录。看起来DB连接属性(即使来自环境变量)被编译到类缓存中。你知道有什么方法可以避免这种情况吗?我们在我当前的项目中正在扩展内核,以便在构造中设置一个额外的参数:
$this->portalidentier=getenv('APP_PORTAL');父项::_构造($environment,$debug)
然后使用该标识符加载不同的配置文件并将其附加到缓存目录。我认为我们没有遇到您的问题,因此如果没有进一步的信息,我想我无法提供帮助。是的。我们还使用了一个Redis服务器,如果我们觉得有必要,我们可以轻松地共享缓存。幸运的是,在我们的服务器上,存储和内存不是一个大问题,因此重复缓存增加的开销并不困扰我们。是的,我知道它不大,我当前的缓存大小是每个目录大约8Mb,所以没什么大不了的。我想我可以接受,我只是想知道是否有办法避免重复,因为从dir到dir的唯一变化是连接参数…:(如果您在内核中使用我的方法和附加的入口标识符,您还可以更改内核返回的名称,然后使用相同的缓存目录。只需使
getName
返回附加的入口标识符或检查编译容器的文件名是如何创建的。然后,只有编译的容器将是单独的cac他创建了项目,但剩余的缓存是相同的。理论上,这是唯一应该存储连接的地方,这样应该可以工作,并且您可以重用缓存。