2017-06-20 52 views
3

因此,我正在安静地构建一个基于Symfony 3的大型SAAS Web应用程序。大约有10-20个应用程序,现在已经发展到超过500多个应用程序。单独的供应商目录已经是每个应用程序150 + MB的大小。带共享代码库的多实例symfony应用程序

所有这些应用程序都有自己的数据库。我想保持这种方式。不过,我相信如果一些代码被共享,这将是很好的。以供应商和src目录为例。这在每个应用程序中都是相同的,但是它们都是在OpCache中单独“加载”的。我相信从资源的角度来看,如果这些目录是共享的,那将是最好的。

Composer和Symfony似乎都不支持共享目录的多实例应用程序。然而,我想知道如果有人有任何线索来实现我的想法或者我的计划不可行?

配置对于每个应用程序(parameters.yml)是不同的,并且web目录在每个应用程序中包含不同的样式表。所以他们需要与其他人分开。

我一直在考虑为此使用环境设置,但我们有环境“测试”,“开发”,“应用程序1”,“应用程序2”等,感觉不对。config_prod.yml突然也变得无法使用。

我的思维方式错了吗?有关如何实现这一目标的任何建议?或者我应该去一个完整的单独实例?

(我们的应用程序使用的是SemVer,如果我们有版本1.0.0,版本1.1.0的共享代码,那么它甚至会很好,所以这甚至是最上面的一个层次,但也许这是下一步)

编辑: 澄清更多; 实质上你可以说web目录和var目录都不可共享。 Web目录包含自定义样式表,并且是主要的入口点。 var目录包含缓存文件,根据其数据库设置,每个应用程序的缓存文件都不相同。 最后,您还有自定义参数文件,每个应用程序都有不同的数据库凭据。

我尝试过符号链接,但作曲家对此并不满意。另外,使用符号链接时,工作目录始终是实际使用的目录,而不是实际的符号链接目录。 我也尝试使用应用程序的vhost文件中的自定义设置。覆盖高速缓存和内核目录是可能的,但是你又失去了你所符合的实际目录。

+0

只是一个想法:Opcache使用真正的路径,你可以替换文件,如果相同的符号链接到“父母”。在作曲家安装后脚本化,你可以从中解脱... – hakre

+0

是的,我试过了。但是,作曲家不支持供应商目录由多个应用程序符号链接。它可以在某个自动加载器中的某处保存路径。 –

+0

我不是指供应商文件夹,而是包中的代码。而不是软件包,但在该级别下的所有文件都是相同的。 Linke递归地比较两个目录树,如果文件相同,则用符号链接替换它。 opcache然后将使用实际路径。这必须在脚本中完成,以便可以通过根除供应商文件夹进行重置,使用composer重新安装,然后重新运行compare&link脚本。 – hakre

回答

0

您需要创建自定义配置目录和/或文件,然后根据您使用的任何标准调整您的AppKernel以指向正确的配置目录和/或文件。例如,如果您要离开某个子域: 首先,请更新您的前端控制器以创建一个新的超级全局域。有可能是一个更好的方式来做到这一点,我建议你寻找到的..

// web/app.php 
use Symfony\Component\HttpFoundation\Request; 

/** @var \Composer\Autoload\ClassLoader $loader */ 
$loader = require __DIR__.'/../app/autoload.php'; 
include_once __DIR__.'/../var/bootstrap.php.cache'; 

list($scheme, $host) = explode('.',$_SERVER['SERVER_NAME']); 
define(APP_CONFIG_FILENAME, sprintf('%s.yml', $host)); 

$kernel = new AppKernel('prod', false); 
$kernel->loadClassCache(); 
//$kernel = new AppCache($kernel); 

// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter 
//Request::enableHttpMethodParameterOverride(); 
$request = Request::createFromGlobals(); 
$response = $kernel->handle($request); 
$response->send(); 
$kernel->terminate($request, $response); 
AppKernel

现在,使用这个新的超全局

// app/AppKernel.php 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel 
{ 
    public function registerContainerConfiguration(LoaderInterface $loader) 
    { 
     $loader->load($this->getProjectDir().'/app/config/' . APP_CONFIG_FILENAME . '.yml'); 
    } 
} 

,然后在example1.yml

# app/config/mysubdomain.yml 
imports: 
    - { resource: 'parameters_example1.yml' } 
    - { resource: 'routing_example1.yml' } 
+0

感谢您的回复,但我不认为这完全可以解决问题。如前所述,每个应用程序都有一个单独的数据库。这意味着缓存也不能在应用程序之间共享。我会更新我的主帖。 –

+0

所以你只需在config_ {x} .yml'中更改缓存配置设置,并在'parameters_ {x} .yml'中设置数据库参数 - 并且为了缓存,您必须设置非文件系统存储或者像redis之类的自定义缓存处理程序,或者如果您想要的话;数据库驱动的缓存与pdo像这样:https://symfony.com/doc/master/components/cache/adapters/pdo_doctrine_dbal_adapter.html或单独的pdo会话处理程序:http://symfony.com/doc/current/doctrine/ pdo_session_storage.html –

+0

除了这个事实,如果你是对的或者没有(我相信你让它听起来更容易,那实际上是因为我不能在缓存中存储任何yml文件),它仍然不能解决问题将vendor和src目录(可能更多)放在共享目录中。 –

相关问题