gpt4 book ai didi

php - 具有共享代码库的多实例 symfony 应用程序

转载 作者:可可西里 更新时间:2023-10-31 23:45:12 26 4
gpt4 key购买 nike

因此,我在 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 目录包含缓存文件,这些文件因应用程序的数据库设置而异。最后,您还有自定义参数文件,每个应用程序都不同,用于存储数据库凭据。

我尝试了符号链接(symbolic link),但 Composer 对此并不满意。此外,当使用符号链接(symbolic link)时,工作目录始终是实际使用的目录,而不是您从中获得符号链接(symbolic link)的实际目录。我还尝试在应用程序的 vhost 文件中使用自定义设置。覆盖缓存和内核目录是可能的,但你又失去了你从中建立符号链接(symbolic link)的实际目录。

最佳答案

您需要创建自定义配置目录和/或文件,然后根据您使用的任何标准调整您的 AppKernel 以指向正确的目录。例如,如果您要离开子域:首先,更新您的前端 Controller 以拥有一个新的 super 全局。可能有更好的方法来做到这一点,我建议您研究一下..

// 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' }

关于php - 具有共享代码库的多实例 symfony 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44649681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com