概述 快速入门 教程 手册 最佳实践 组件 参考 贡献

发布于 2015-08-27 16:43:42 | 170 次阅读 | 评论: 0 | 来源: 网络整理

Every application is the combination of code and a set of configuration that dictates how that code should function. The configuration may define the database being used, whether or not something should be cached, or how verbose logging should be. In Symfony, the idea of “environments” is the idea that the same codebase can be run using multiple different configurations. For example, the dev environment should use configuration that makes development easy and friendly, while the prod environment should use a set of configuration optimized for speed.

Different Environments, different Configuration Files

A typical Symfony application begins with three environments: dev, prod, and test. As discussed, each “environment” simply represents a way to execute the same codebase with different configuration. It should be no surprise then that each environment loads its own individual configuration file. If you’re using the YAML configuration format, the following files are used:

  • for the dev environment: app/config/config_dev.yml
  • for the prod environment: app/config/config_prod.yml
  • for the test environment: app/config/config_test.yml

This works via a simple standard that’s used by default inside the AppKernel class:

// app/AppKernel.php

// ...

class AppKernel extends Kernel
{
    // ...

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

As you can see, when Symfony is loaded, it uses the given environment to determine which configuration file to load. This accomplishes the goal of multiple environments in an elegant, powerful and transparent way.

Of course, in reality, each environment differs only somewhat from others. Generally, all environments will share a large base of common configuration. Opening the “dev” configuration file, you can see how this is accomplished easily and transparently:

  • YAML
    imports:
        - { resource: config.yml }
    
    # ...
    
  • XML
    <imports>
        <import resource="config.xml" />
    </imports>
    
    <!-- ... -->
    
  • PHP
    $loader->import('config.php');
    
    // ...
    

To share common configuration, each environment’s configuration file simply first imports from a central configuration file (config.yml). The remainder of the file can then deviate from the default configuration by overriding individual parameters. For example, by default, the web_profiler toolbar is disabled. However, in the dev environment, the toolbar is activated by modifying the default value in the dev configuration file:

  • YAML
    # app/config/config_dev.yml
    imports:
        - { resource: config.yml }
    
    web_profiler:
        toolbar: true
        # ...
    
  • XML
    <!-- app/config/config_dev.xml -->
    <imports>
        <import resource="config.xml" />
    </imports>
    
    <webprofiler:config toolbar="true" />
    
  • PHP
    // app/config/config_dev.php
    $loader->import('config.php');
    
    $container->loadFromExtension('web_profiler', array(
        'toolbar' => true,
    
        // ...
    ));
    

Executing an Application in different Environments

To execute the application in each environment, load up the application using either the app.php (for the prod environment) or the app_dev.php (for the dev environment) front controller:

http://localhost/app.php      -> *prod* environment
http://localhost/app_dev.php  -> *dev* environment

注解

The given URLs assume that your web server is configured to use the web/ directory of the application as its root. Read more in Installing Symfony.

If you open up one of these files, you’ll quickly see that the environment used by each is explicitly set:

// web/app.php
// ...

$kernel = new AppKernel('prod', false);

// ...

As you can see, the prod key specifies that this application will run in the prod environment. A Symfony application can be executed in any environment by using this code and changing the environment string.

注解

The test environment is used when writing functional tests and is not accessible in the browser directly via a front controller. In other words, unlike the other environments, there is no app_test.php front controller file.

Selecting the Environment for Console Commands

By default, Symfony commands are executed in the dev environment and with the debug mode enabled. Use the --env and --no-debug options to modify this behavior:

# 'dev' environment and debug enabled
$ php app/console command_name

# 'prod' environment (debug is always disabled for 'prod')
$ php app/console command_name --env=prod

# 'test' environment and debug disabled
$ php app/console command_name --env=test --no-debug

In addition to the --env and --debug options, the behavior of Symfony commands can also be controlled with environment variables. The Symfony console application checks the existence and value of these environment variables before executing any command:

SYMFONY_ENV
Sets the execution environment of the command to the value of this variable (dev, prod, test, etc.);
SYMFONY_DEBUG
If 0, debug mode is disabled. Otherwise, debug mode is enabled.

These environment variables are very useful for production servers because they allow you to ensure that commands always run in the prod environment without having to add any command option.

Creating a new Environment

By default, a Symfony application has three environments that handle most cases. Of course, since an environment is nothing more than a string that corresponds to a set of configuration, creating a new environment is quite easy.

Suppose, for example, that before deployment, you need to benchmark your application. One way to benchmark the application is to use near-production settings, but with Symfony’s web_profiler enabled. This allows Symfony to record information about your application while benchmarking.

The best way to accomplish this is via a new environment called, for example, benchmark. Start by creating a new configuration file:

  • YAML
    # app/config/config_benchmark.yml
    imports:
        - { resource: config_prod.yml }
    
    framework:
        profiler: { only_exceptions: false }
    
  • XML
    <!-- app/config/config_benchmark.xml -->
    <imports>
        <import resource="config_prod.xml" />
    </imports>
    
    <framework:config>
        <framework:profiler only-exceptions="false" />
    </framework:config>
    
  • PHP
    // app/config/config_benchmark.php
    $loader->import('config_prod.php')
    
    $container->loadFromExtension('framework', array(
        'profiler' => array('only-exceptions' => false),
    ));
    

注解

Due to the way in which parameters are resolved, you cannot use them to build paths in imports dynamically. This means that something like the following doesn’t work:

  • YAML
    # app/config/config.yml
    imports:
        - { resource: "%kernel.root_dir%/parameters.yml" }
    
  • XML
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <imports>
            <import resource="%kernel.root_dir%/parameters.yml" />
        </imports>
    </container>
    
  • PHP
    // app/config/config.php
    $loader->import('%kernel.root_dir%/parameters.yml');
    

And with this simple addition, the application now supports a new environment called benchmark.

This new configuration file imports the configuration from the prod environment and modifies it. This guarantees that the new environment is identical to the prod environment, except for any changes explicitly made here.

Because you’ll want this environment to be accessible via a browser, you should also create a front controller for it. Copy the web/app.php file to web/app_benchmark.php and edit the environment to be benchmark:

// web/app_benchmark.php
// ...

// change just this line
$kernel = new AppKernel('benchmark', false);

// ...

The new environment is now accessible via:

http://localhost/app_benchmark.php

注解

Some environments, like the dev environment, are never meant to be accessed on any deployed server by the general public. This is because certain environments, for debugging purposes, may give too much information about the application or underlying infrastructure. To be sure these environments aren’t accessible, the front controller is usually protected from external IP addresses via the following code at the top of the controller:

if (!in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) {
    die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

Environments and the Cache Directory

Symfony takes advantage of caching in many ways: the application configuration, routing configuration, Twig templates and more are cached to PHP objects stored in files on the filesystem.

By default, these cached files are largely stored in the app/cache directory. However, each environment caches its own set of files:

<your-project>/
├─ app/
│  ├─ cache/
│  │  ├─ dev/   # cache directory for the *dev* environment
│  │  └─ prod/  # cache directory for the *prod* environment
│  ├─ ...

Sometimes, when debugging, it may be helpful to inspect a cached file to understand how something is working. When doing so, remember to look in the directory of the environment you’re using (most commonly dev while developing and debugging). While it can vary, the app/cache/dev directory includes the following:

  • appDevDebugProjectContainer.php - the cached “service container” that represents the cached application configuration;
  • appDevUrlGenerator.php - the PHP class generated from the routing configuration and used when generating URLs;
  • appDevUrlMatcher.php - the PHP class used for route matching - look here to see the compiled regular expression logic used to match incoming URLs to different routes;
  • twig/ - this directory contains all the cached Twig templates.

注解

You can easily change the directory location and name. For more information read the article 如何重载Symfony默认的目录结构.

Going further

Read the article on 如何将Service Container的参数暴露到外部.

最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务