带共享代码库的多实例symfony应用程序
因此,我正在安静地构建一个基于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文件中的自定义设置。覆盖高速缓存和内核目录是可能的,但是你又失去了你所符合的实际目录。
您需要创建自定义配置目录和/或文件,然后根据您使用的任何标准调整您的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' }
感谢您的回复,但我不认为这完全可以解决问题。如前所述,每个应用程序都有一个单独的数据库。这意味着缓存也不能在应用程序之间共享。我会更新我的主帖。 –
所以你只需在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 –
除了这个事实,如果你是对的或者没有(我相信你让它听起来更容易,那实际上是因为我不能在缓存中存储任何yml文件),它仍然不能解决问题将vendor和src目录(可能更多)放在共享目录中。 –
只是一个想法:Opcache使用真正的路径,你可以替换文件,如果相同的符号链接到“父母”。在作曲家安装后脚本化,你可以从中解脱... – hakre
是的,我试过了。但是,作曲家不支持供应商目录由多个应用程序符号链接。它可以在某个自动加载器中的某处保存路径。 –
我不是指供应商文件夹,而是包中的代码。而不是软件包,但在该级别下的所有文件都是相同的。 Linke递归地比较两个目录树,如果文件相同,则用符号链接替换它。 opcache然后将使用实际路径。这必须在脚本中完成,以便可以通过根除供应商文件夹进行重置,使用composer重新安装,然后重新运行compare&link脚本。 – hakre