Performance Symfony2多内核?

Performance Symfony2多内核?,performance,bundle,benchmarking,symfony,Performance,Bundle,Benchmarking,Symfony,我有一个应用程序,其中有核心网站,api和管理领域。我想知道把所有东西都放在一个应用程序中是个坏主意,还是我应该创建不同的Symfony2项目,或者我应该把它们分成不同的内核 我不确定在同一个内核上添加很多bundle是否会对性能产生很大影响,或者只是一点点,这无关紧要 以下是一些选择: 把所有东西都放在同一个内核上,不会有太大区别 为应用程序的不同部分(api、管理员和核心网站)提供多个内核 为管理区域和api创建不同的Symfony2项目 或者你的智慧之言:) 这是个人的选择,但我有一个类似

我有一个应用程序,其中有核心网站,api和管理领域。我想知道把所有东西都放在一个应用程序中是个坏主意,还是我应该创建不同的Symfony2项目,或者我应该把它们分成不同的内核

我不确定在同一个内核上添加很多bundle是否会对性能产生很大影响,或者只是一点点,这无关紧要

以下是一些选择:

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

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

    额外的绩效损失是负责任的,但组织是关键。。。这就是我们首先使用MVC包(Symfony)的原因,不是吗


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

    它主要取决于Bundle的质量。这就是他们之间的联系

    我会在开始时拒绝第3点(
    为管理区域和api创建不同的Symfony2项目。
    )-因为您可能不会构建两个独立的应用程序

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

    常见的问题是由容器中的侦听器和服务造成的。特别是当你的监听器应该只在一个应用程序上下文(api/前端/后端)中工作时。即使您记得在侦听器方法的最开始检查它(并且只在需要的上下文中执行魔术),那么侦听器仍然可以依赖于注入的服务,这些服务无论如何都需要被构造和注入。FOS/RestBundle就是一个很好的例子:即使您配置了
    区域
    ,但仍然在前端(当api的
    视图监听器
    被激活时)
    视图处理程序
    被初始化并注入监听器-我不确定这里是否100%,但也禁用了api的翻译和细枝(等等)(大多数api不需要它)会加快速度的

    为API上下文创建单独的内核可以解决这个问题(在我们的项目中,我们使用一个内核,我们必须禁用该侦听器——正如blackfire.io配置文件告诉我们的那样,它在每个前置请求上节省了约15毫秒)

    为API创建新内核将确保所有仅API的服务/侦听器都不会干扰前端/后端呈现(它可以双向工作)。但它将为您创建额外的工作,创建共享的
    组件
    ,这些组件用于项目内部的许多捆绑包(来自不同内核的组件)——但在composer的世界中,这不再是一项艰巨的任务


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

    有几个内核未必有帮助

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

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

    注意:

    如果你打算将你的应用程序分成两个大捆绑包(即Admin和Api), 而这两者共享相同的实体,你肯定要做一个选择

    这个选择可能涉及到您的一个bundle包含太多(且不相关)逻辑,需要在以后的几个bundle中进行重构

    为应用程序的每个部分创建一个对应于一组相关资源的包,并通过配置中的不同上下文来区分这两个部分

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

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

    例如:

    在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;
       }
    }
    

    不,我说的内核是指内核。。。我有所有的包裹。。只是不确定生产中是否有很多捆绑包是个不错的选择,因为并不是所有捆绑包都在主网站上运行。拥有多个捆绑包(我们这里只讨论几个捆绑包)确实不会影响性能。如果所有内容都是针对同一个域、同一个品牌、同一个URL,那么就使用同一个内核。不需要的两个额外捆绑包几乎接近10个以上的捆绑包,所以要做真正有趣的东西和事件处理。。喜欢sonataAdminBundle@Basit我建议您在问题中添加最后一条评论的内容,事实上您有10多个捆绑包(这个数字不在您的问题中),而且它们确实有很多新奇的东西(加载配置?等等),这可能会对性能产生影响。在你的问题中值得一提。你可以尝试创建环境来完成这项工作,下面是开发人员的例子,如果(在数组中($this->getEnvironment(),数组('dev','test')){在AppKernel中,您对我之前的评论有何看法?您忘记了一个选项:将代码拆分为多个捆绑包,这里已经讨论过了:或者。@Basit我确信您是否将配置拆分为一个或多个捆绑包,因此我更愿意共享链接。不管怎样,根据pietro的想法,您似乎可以加载不同的配置捆绑包取决于您的环境,这将避免加载不必要的捆绑包。@基本上,通过此解决方案,您可以为每个环境配置路由、参数等。我确实有多个捆绑包,但在捆绑包中创建不同的东西并不能真正帮助我所问的。我问的是性能,这将如何影响,即使你可以把东西放在不同的包中,但在调用路径之前,你不需要它。我认为这在习惯上是不对的。API包可能在两个生产/开发环境中加载,为我们提供了不同的行为。因此,例如,ENV是核心应用程序、API应用程序的一种模式