Php Symfony 2-多服务器配置

Php Symfony 2-多服务器配置,php,configuration,symfony,Php,Configuration,Symfony,我们开始在工作中的项目中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎已经解决了,但还没有完全解决 Symfony将环境的概念视为单个服务器上的独立运行时。这很好,因为您可以使用不同的前端控制器(web)在运行时之间切换,也可以随心所欲地使用env开关(cli) 但是,我们的代码作为开发过程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过集成、QA、登台,最后是生产向上传播 因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标 在运行时环境切换

我们开始在工作中的项目中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎已经解决了,但还没有完全解决

Symfony将环境的概念视为单个服务器上的独立运行时。这很好,因为您可以使用不同的前端控制器(web)在运行时之间切换,也可以随心所欲地使用env开关(cli)

但是,我们的代码作为开发过程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过集成、QA、登台,最后是生产向上传播

因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标

  • 在运行时环境切换方面维护Symfony的ootb功能
  • 允许每个服务器进行公共(即开发人员控制的)配置
  • 维护每台服务器的私有(即sysad控制的)配置
  • 适用于web和cli
  • 这意味着我们不能100%依赖parameters.ini或任何静态命名的文件,因为开发人员需要控制每个服务器的配置,而且所有这些文件都将在git中彼此相邻

    所以,我想做的就是这样。向parameters.ini添加一个新值,用于设置服务器环境。像这样的

    app/config/parameters.ini

    [parameters]
        server="int"
    
    [parameters]
        # ...
        server.env="int"
        server.title="Integration"
        server.name="Int 1"
    
    然后,在内核中,基于该值加载一个额外的配置文件。例如,我很想让它工作,但它没有工作(因为在这个步骤中容器还不存在)

    app/AppKernel.php

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
      $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    
      // Per-server config
      $server = $this->getContainer()->getParameter( 'server' );        
      if ( $server )
      {
        $loader->load(__DIR__.'/config/server/'.$server.'.yml');
      }
    }
    
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
    
      // Symfony environment config
      $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    
      // Load server config, if it exists
      $parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
      if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
      {
        $serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
        if ( file_exists( $serverConfig ) )
        {
          $loader->load( $serverConfig );
        } else {
          error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
        }
      }
    }
    
    这将允许使用像app/config/server/int.yml这样的文件,开发人员可以使用该文件控制非私有(即非parameters.ini)配置值

    谢谢你的阅读,如果有什么让我困惑的地方,请告诉我

    编辑 澄清一下,我不能使用或依靠的东西

    • *从用户配置文件或通过
      export
      导出nix环境变量。为什么?集成、QA和登台可能都在同一个框中
    • vhost配置中的任何内容(不适用于cli)
    • 静态命名的文件(即,仅命名为server.ini的文件将不起作用)

      • 好的,我终于想出了该怎么办。实际上只需要对AppKernel进行基本修改

        app/AppKernel.php

        public function registerContainerConfiguration(LoaderInterface $loader)
        {
          $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
        
          // Per-server config
          $server = $this->getContainer()->getParameter( 'server' );        
          if ( $server )
          {
            $loader->load(__DIR__.'/config/server/'.$server.'.yml');
          }
        }
        
        public function registerContainerConfiguration(LoaderInterface $loader)
        {
        
          // Symfony environment config
          $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
        
          // Load server config, if it exists
          $parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
          if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
          {
            $serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
            if ( file_exists( $serverConfig ) )
            {
              $loader->load( $serverConfig );
            } else {
              error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
            }
          }
        }
        
        app/config/parameters.ini

        [parameters]
            server="int"
        
        [parameters]
            # ...
            server.env="int"
            server.title="Integration"
            server.name="Int 1"
        
        现在我可以根据需要在app/config/server/
        中创建%server.env%.yml文件


        多亏了那些读过这篇文章的人——我最初想到的是更复杂的东西,它让这个简单的解决方案暂时看不见;)

        为什么您认为需要使用Symfony2环境来处理您的服务器环境?从本质上来说,我不是。我只是想找出最好的方法来加载每个服务器的配置,这些配置仍在开发人员的控制之下。您仍然可以使用
        parse_ini_file
        方法解析
        parameters.ini
        。虽然我不清楚你的问题。您是说每个服务器配置文件将具有不同的路由/安全配置吗?您可以阅读下面的解决方案。这是一个很难描述的场景,希望解决方案能让它更清晰。