我有一个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%"
这很有效。最后一个值将合并到参数中并被替换。