所以,我正在安静地建立一个基于Symfony 3的大型SAAS Web应用程序。从大约10到20个应用程序开始,现在已经发展到超过500个应用程序。每个应用程序单独的供应商目录的大小为150+ MB。
所有这些应用程序都有自己的数据库。我想保持这种方式。但是,我相信如果共享一些代码会很好。以vendor和src目录为例。它在每个应用程序中都是相同的,但是所有这些都在OpCache中单独“加载”。我相信,从资源的角度来看,最好是共享这些目录。
Composer和Symfony似乎都不支持具有共享目录的多实例应用程序。我想知道是否有人有任何线索可以实现我的想法,或者我的计划是不可行的?
每个应用程序(parameters.yml)的配置不同,并且web目录包含每个应用程序的不同样式表。所以他们需要与其他人分开。
我一直在考虑使用环境设置,但我们觉得我们有环境“test”,“dev”,“application1”,“application2”等等,这也不合适.config_prod.yml突然也然后变得无法使用。
我的思维方式错了吗?有关如何实现这一目标的任何建议?或者我应该选择一个完整的单独实例?
(我们的应用程序正在使用SemVer,如果我们有1.0.0版本的共享代码,版本1.1.0等,它甚至会很好。所以这甚至是下一层。但也许这是下一步。 )
编辑: 澄清一点; 从本质上讲,您可以说web目录和var目录都是不可共享的。 Web目录包含自定义样式表,是主要入口点。 var目录包含缓存文件,每个应用程序的缓存文件不同,具体取决于其数据库设置。 最后,您还拥有自定义参数文件,该文件与存储数据库凭据的每个应用程序不同。
我尝试过symlinking,但作曲家对此并不满意。此外,使用符号链接时,工作目录始终是实际使用的目录,而不是您符号链接的实际目录。 我还尝试了应用程序的vhost文件中的自定义设置。可以覆盖缓存和内核目录,但是你再次松开了你要进行符号链接的实际目录。
答案 0 :(得分: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' }