微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

因此,我在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文件中的自定义设置.可以覆盖缓存和内核目录,但是再次松开了您正在进行符号链接的实际目录.

解决方法

您需要创建自定义配置目录和/或文件,然后根据您使用的任何条件调整AppKernel以指向正确的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' }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐