【问题标题】:Symfony2 multiple kernel?Symfony2 多内核?
【发布时间】:2016-05-27 04:49:24
【问题描述】:

我的应用程序具有核心网站、api 和管理区域。我想知道将所有东西都放在一个应用程序中是个坏主意,还是应该创建不同的 Symfony2 项目,还是应该将它们拆分为不同的内核?

我不确定在同一个内核上添加大量包是否会对性能产生很大影响,或者只是一点点影响,这没关系?

以下是选项:

  1. 把所有东西都放在同一个内核上,不会有太大区别
  2. 为应用程序的不同部分(api、管理和核心网站)提供多个内核
  3. 为管理区和 api 创建不同的 Symfony2 项目。
  4. 或者你的明智之言 :)

【问题讨论】:

  • 您可以尝试创建环境来执行此操作,请按照开发示例在 appKernel 中执行此操作if (in_array($this->getEnvironment(), array('dev', 'test'))) {
  • 你觉得我之前的评论怎么样?
  • 您忘记了一个选项:将代码拆分成几个包,这里已经讨论过:Should everything really be a bundle in Symfony 2.x?Symfony2 conceptual issue: general bundles vs. specific ones
  • @Basit 我确定您是否将配置拆分为一个或多个捆绑包,所以我更愿意分享链接。无论如何,根据 pietro 的想法和new environments,您似乎可以根据您的环境加载不同的包,这应该避免加载不需要的包。
  • @Basit 通过这个解决方案,您可以为每个环境配置路由、参数等。

标签: performance bundle benchmarking symfony


【解决方案1】:

您可以定义更多“环境”。

例如:

AppKernel.php

public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            //new AppBundle\AppBundle()
        );

        if (in_array($this->getEnvironment(), array('api'), true)) {
            $bundles[] = new ApiBundle\ApiBundle();
            //-- Other bundle
        }
        //-- Other environments


        return $bundles;
   }
}

【讨论】:

  • 我不认为这在惯用语上是正确的。 API 包可能会在生产/开发环境中加载,从而为我们提供不同的行为。所以举个例子,ENV是Core App、Api应用领域的一种模式。我们还可以有 STAGING、TESTING 环境。
【解决方案2】:

拥有多个内核不一定有帮助。

将您的应用程序拆分为捆绑包,并保持通过应用程序的不同部分共享您的实体(等等)的所有优势。

您可以定义单独的路由/控制器/配置,根据主机/url 加载。

注意:

如果您要将应用分成两个大包(即 Admin 和 Api), 并且两者共享相同的实体,您肯定必须做出选择。

此选择可能涉及您的一个捆绑包包含太多(且不相关)逻辑,并且稍后需要在多个捆绑包中重构。

为应用程序的每个部分创建一个与一组相关资源相对应的包,并通过配置中的不同上下文在两个部分之间产生差异。

另外,合理地命名你的类/命名空间。

【讨论】:

  • 我确实有多个捆绑包,但在捆绑包中创建不同的东西并没有真正帮助我的要求。我在问性能,这将如何影响,即使你确实将东西放在不同的包中,但是在调用它的路径之前你不需要它的数千个包..
【解决方案3】:

这主要取决于捆绑包的质量。这就是他们之间的联系程度。

我会在开始时拒绝第 3 点 (create different Symfony2 project for admin area and api.) - 因为您可能没有构建两个单独的应用程序。

为应用程序的不同部分(api、管理员和核心网站)提供多个内核

常见问题是由容器中的侦听器和服务造成的。尤其是当您的侦听器应仅在应用程序上下文之一(api/frontend/backend)中工作时。即使您记得在侦听器方法的一开始就检查它(并且只在想要的上下文中执行魔术),那么侦听器仍然可以依赖于无论如何都需要构建和注入的注入服务。这里的一个很好的例子是 FOS/RestBundle:即使你配置了 zones 然后仍然在前端(当为 api 激活 view_listener 时)view_handler 被初始化并注入到监听器 - https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/config/view_response_listener.xml#L11 我不确定 100%在这里,但也禁用 API 的翻译和树枝(等)(大多数 api 不需要它)会加快速度。

为 API 上下文创建单独的内核将解决该问题(在我们的项目中,我们使用一个内核,并且我们不得不禁用该侦听器 - 因为 blackfire.io 配置文件告诉我们它在每个前端请求上节省了大约 15 毫秒)。

为 API 创建新内核将确保所有仅 API 服务/侦听器都不会干扰前端/后端渲染(它可以双向工作)。但它会为您创建额外的工作,即创建在项目内的许多包(来自不同内核的包)中使用的共享components - 但在使用 composer 的世界中,这不再是一项艰巨的任务了。

但这仅适用于测量每毫秒响应时间的人。并且取决于您的/3dparty 捆绑包质量。如果一切都很好,那么你不需要弄乱内核。

【讨论】:

    【解决方案4】:

    这是个人选择,但我有一个类似的项目,我在同一个项目中有一个 publicBundle、adminBundle 和 apiBundle。

    额外的性能损失可以忽略不计,但组织是关键……这就是我们首先使用 MVC 包 (Symfony) 的原因,不是吗? :)

    注意:你的术语有点混乱,我认为Kernel 是指Bundle

    【讨论】:

    • 不,我所说的内核是指内核……我有所有的捆绑包……只是不确定生产中是否有很多捆绑包是一个不错的选择,因为并非所有捆绑包都在主网站上运行。
    • 拥有多个捆绑包(我们在这里只讨论几个)确实不会影响性能。如果一切都针对同一个域、同一个品牌、同一个 URL,那么就使用一个内核。
    • 几个不需要的额外捆绑包几乎接近 10 多个捆绑包,所以真的很花哨的东西和事件处理.. 像 sonataAdminBundle
    • @Basit 我建议你在你的问题中添加最后一条评论的内容,事实上你有 10 多个捆绑包(这个数字不在你的问题中)并且他们 真正花哨的东西(加载配置?等)会对性能产生影响。在你的问题中值得一提。
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2014-09-27
    相关资源
    最近更新 更多