Symfony2 is not using the config_prod.yml



我有一个symfony2-项目,但我无法让它使用我的config_prod.yml。我在parameters.yml.Other中设置了两个数据库主机,分别用于本地主机的开发和生产。我相应地调用config_dev.yml和config_prod.yml中的这些参数,但prod中的参数不起作用。它总是使用config_dev.yml中的数据库,如果我把prod-database url放在config_dev.yml中,它就会连接到那里。不管我在config_prod.yml中输入了什么,它从不使用这些值。

这是我的config_dev.yml:

imports:
    - { resource: config.yml }
framework:
    router:
        resource: "%kernel.root_dir%/config/routing_dev.yml"
        strict_requirements: true
    profiler: { only_exceptions: false }
web_profiler:
    toolbar: true
    intercept_redirects: false
assetic:
    use_controller: true
doctrine:
    dbal:
        host: "%database_host_local%"

这是我的config_prod.yml:

imports:
    - { resource: config.yml }
doctrine:
    dbal:
        host: "%database_host_prod%"

(其余的数据库值在config.yml中设置,因为我现在只想更改主机。(

以下是参数。yml(当然所有值都改变了(:

parameters:
    database_driver: pdo_mysql
    database_host_local: localhost
    database_host_prod: 11.11.11.11 # <-- This is never used if called in the config_prod.yml but IS used when called from the config_dev.yml
    database_port: 3306
    database_name: mydb
    database_user: user
    database_password: pass
    database_charset: utf8mb4

最后是我用来更改envs:的.htaccess文件

RedirectMatch permanent ^/app.php/(.*) /$1
DirectoryIndex app.php
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
    # Redirect to https-site:
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    # Explicitly disable rewriting for front controllers
    RewriteRule app_dev.php - [L]
    RewriteRule app.php - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    # Change below before deploying to production
    RewriteRule ^(.*)$ app.php [QSA,L]
    #RewriteRule ^(.*)$ app_dev.php [QSA,L]
</IfModule>
<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        # When mod_rewrite is not available, we instruct a temporary redirect of
        # the start page to the front controller explicitly so that the website
        # and the generated links can still be used.
        RedirectMatch 302 ^/$ /app.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

除了添加捆绑包之外,我还没有接触过AppKernel。

为什么symfony不使用config_prod.yml?

编辑:app.php(第一个(和AppKernel.php(第二个(

<?php
use SymfonyComponentClassLoaderApcClassLoader;
use SymfonyComponentHttpFoundationRequest;
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
// Enable APC for autoloading to improve performance.
// You should change the ApcClassLoader first argument to a unique prefix
// in order to prevent cache key conflicts with other applications
// also using APC.
/*
$apcLoader = new ApcClassLoader(sha1(__FILE__), $loader);
$loader->unregister();
$apcLoader->register(true);
*/
require_once __DIR__.'/../app/AppKernel.php';
//require_once __DIR__.'/../app/AppCache.php';
$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();
Request::setTrustedProxies(array('127.0.0.1', $request->server->get('REMOTE_ADDR')));
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

AppKernel.php:

use SymfonyComponentHttpKernelKernel;
use SymfonyComponentConfigLoaderLoaderInterface;
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new SymfonyBundleFrameworkBundleFrameworkBundle(),
            new SymfonyBundleSecurityBundleSecurityBundle(),
            new SymfonyBundleTwigBundleTwigBundle(),
            new SymfonyBundleMonologBundleMonologBundle(),
            new SymfonyBundleSwiftmailerBundleSwiftmailerBundle(),
            new SymfonyBundleAsseticBundleAsseticBundle(),
            new DoctrineBundleDoctrineBundleDoctrineBundle(),
            new SensioBundleFrameworkExtraBundleSensioFrameworkExtraBundle(),
            new AppBundleAppBundle(),
            new OldSoundRabbitMqBundleOldSoundRabbitMqBundle(),
            new FOSRestBundleFOSRestBundle(),
            new FOSUserBundleFOSUserBundle(),
        );
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new SymfonyBundleDebugBundleDebugBundle();
            $bundles[] = new SymfonyBundleWebProfilerBundleWebProfilerBundle();
            $bundles[] = new SensioBundleDistributionBundleSensioDistributionBundle();
        }
        return $bundles;
    }
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
    }
    public function __construct($environment, $debug)
    {
        date_default_timezone_set( 'Area/City' ); //<-- Changed the timezone from mine.
        parent::__construct($environment, $debug);
    }
}

我刚刚想出了这个。真的很简单,但很容易忘记。我使用rabbitmq进行消息传递,并在后台运行rabbitmqconsumers。这些消费者不时从队列中接收消息,但这些消息从未通过app.php或app_dev.php,因为消费者只是后台运行的进程!愚蠢的我没有这么想。

消费者从这样的控制台命令开始:

php app/console rabbitmq:etc..

文件说明如下:

默认情况下,控制台命令在开发环境中运行,您可以想要为某些命令更改此项。

因此,解决方案是这样启动消费者:

php app/console --env=prod rabbitmq:etc..

也许您应该尝试另一种方法。因此,通常parameters.yml是从parameters.yml.dist文件生成的本地文件。dist文件是一个模板,composer更新程序在其中创建值并将其写入parameters.yml。因此,最好将parameters.yml从存储库中排除。并更改您需要的机器上的值。

例如,如果您在您的暂存系统上,那么将您的暂存数据库写入参数文件。如果您在开发系统上,则将开发数据库写入配置文件。然后,您不需要为每个环境指定主机,并且可以在本地使用您的文件。

在我的情况下,我有另一个用于所有单元测试的数据库。当我像这样覆盖参数时,我很容易覆盖它们。在config_test.yml

imports:
    - { resource: config_dev.yml }
parameters:
    database_name: "%database_name_unittest%"

这很有效。最后一个值将合并到参数中并被替换。

相关内容

  • 没有找到相关文章

最新更新