1

我们有三台开发服务器(dev1、dev2、stage)和一台生产服务器和一些 symfony 项目。

我们想自动改变环境。目前我的 hack 在 'public/index.php' 中看起来像这样

use App\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;

require __DIR__.'/../vendor/autoload.php';

//----------- hack start ------------

$_SERVER['APP_ENV'] = 'prod';
$_SERVER['APP_DEBUG'] = 0;
$_SERVER['APP_SECRET'] = '67d829bf61dc5f87a73fd814e2c9f629';

$localIP = getHostByName(getHostName());
if ($localIP === '81.4.552.97') {
     $_SERVER['APP_ENV'] = 'dev1';
     $_SERVER['APP_DEBUG'] = 1;
     $_SERVER['APP_SECRET'] = '67d829bf61dc5f87a73fd814e2c9f629';
}

...

//----------- hack end ------------

// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
    (new Dotenv())->load(__DIR__.'/../.env');
}

if ($_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev'))) {
    umask(0000);

    Debug::enable();
}

// Request::setTrustedProxies(['0.0.0.0/0'], Request::HEADER_FORWARDED);

$kernel = new Kernel($_SERVER['APP_ENV'] ?? 'dev', $_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev')));
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

我在“config/packages/*”下有三个新环境,包括数据库和电子邮件的配置。

这是正确的方法吗?也许其他一些人也有这个问题。我刚刚在dev1下测试了一下,好像在运行。

4

3 回答 3

3

最简单的方法可能是通过 HTTP 服务器设置环境。对于 Apache,在 .htaccess 中:

SetEnvIf Remote_Addr 1\.2\.3\.4 APP_ENV=dev
SetEnvIf Remote_Addr 1\.2\.3\.4 APP_DEBUG=1

其余的在.env.dev

于 2020-11-04T07:29:11.463 回答
0

目前我认为最好的解决方案是删除 dotenv composer remove symfony/apache-pack并在public/index.phpbin/console

use App\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;

require __DIR__.'/../env.php';   
require __DIR__.'/../vendor/autoload.php';

// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
    (new Dotenv())->load(__DIR__.'/../.env');
}
...

在此env.php我可以为环境声明所有服务器变量

$_SERVER['APP_ENV'] = 'xxx';
$_SERVER['MAILER_URL'] = 'null://localhost';
$_SERVER['APP_SECRET'] = '425017d316ee2a08e54c6f2bfc59ff8d';
$_SERVER['DATABASE_URL'] = 'xxx';

我认为这是一个不错且快速的解决方案。(如果某天没有安装 php,apache 服务器将不会发送包含所有配置的文件;))

于 2018-07-01T07:29:28.633 回答
0

为什么不只使用环境变量?

https://symfony.com/doc/current/configuration/external_parameters.html

于 2018-06-30T08:22:35.863 回答