【问题标题】:laravel enviroment when on command line different to in browser命令行上的laravel环境与浏览器中的不同
【发布时间】:2014-03-02 11:29:00
【问题描述】:

我已将我的 laravel 应用程序部署到弹性 beanstalk 环境中。该应用程序使用 bootstrap/start.php 中的这段代码检测其环境

$env = $app->detectEnvironment(function () {
    return getenv('APP_ENV') ?: 'local';
});

当弹性 beanstalk 启动时,它会运行我设置的配置文件,以检测是否设置了参数。在这种情况下,我将此参数设置为开发,然后配置文件基于此设置环境变量

APP_ENV = development
DB_HOST = rds dev endpoint
DB_NAME = rds dev db name
DB_USERNAME = dev username
DB_PASSWORD = devdb pass

当我在浏览器中访问应用程序时,它按预期工作,并且正确连接到开发数据库。

当我 ssh 进入服务器并尝试运行时

php artisan migrate

我得到一个 pdo 异常,没有这样的文件或目录

当我跑步时

php artisan env

即使定义了环境变量 APP_ENV,也会返回本地。我非常确定这个变量是被定义的,因为当浏览器中的 laravel 错误时,我可以在服务器/请求数据中看到具有值开发的变量以及在环境启动时创建的其他环境变量

我错过了什么?

根据 antonios answer 进行了编辑以包含个性化解决方案

.环境

<?php
if (getenv('PARAM1') === false) {
    return false;
} else {
    switch (getenv('PARAM1')) {
        case 'development':

            return array(
                'APP_ENV' => 'development',

                'DB_HOST' => '***',
                'DB_NAME' => '***',
                'DB_USERNAME' => '***',
                'DB_PASSWORD' => '***',
                );
            break;

        case 'staging':

            return array(
                'APP_ENV' => 'staging',

                'DB_HOST' => '***',
                'DB_NAME' => '***',
                'DB_USERNAME' => '***',
                'DB_PASSWORD' => '***',
                );
            break;

        case 'production':

            return array(
                'APP_ENV' => 'production',

                'DB_HOST' => '***',
                'DB_NAME' => '***',
                'DB_USERNAME' => '***',
                'DB_PASSWORD' => '***',
                );
            break;
    }
}

start.php

$env = require __DIR__.'/../.environment';

if ($env !== false) {
    foreach ($env as $key => $value) {
        putenv(sprintf('%s=%s', $key, $value));
    }
}

$env = $app->detectEnvironment(function () {
    return getenv('APP_ENV') ?: 'local';
});

【问题讨论】:

  • 好的,但是,你把所有的变量都放在你的 git 里????我和你的情况完全一样

标签: amazon-web-services laravel-4 amazon-elastic-beanstalk


【解决方案1】:

当你运行时

php artisan migrate

php 在不同的用户下运行,而不是您的网络服务器,因此您需要:

php artisan migrate --env=development

编辑

cli 和 web 遇到问题是我不使用那些 web 服务器环境变量的原因之一。这就是我处理环境的方式:

在应用程序的根目录中创建一个 .environment 文件并定义您的环境:

<?php

return array(

     'APP_ENV' => 'development',

     'POSTGRESQL.HOST' => 'localhost',
     'POSTGRESQL.DATABASE_NAME' => 'laraveldatabase',
     'POSTGRESQL.DATABASE_USER' => 'laraveluser',
     'POSTGRESQL.DATABASE_PASSWORD' => '!Bassw0rT',

);

将其添加到您的 .gitignore 应用程序文件中,这样您就不会冒险将密码发送到 Github。

$app-&gt;detectEnvironment之前,将.environment文件加载到PHP环境中:

foreach(require __DIR__.'/../.environment' as $key => $value) 
{
    putenv(sprintf('%s=%s', $key, $value));
}

然后你只需要使用它:

$env = $app->detectEnvironment(function () {
    return getenv('APP_ENV');
});

它无处不在:

<?php

return array(

    'connections' => array(

         'postgresql' => array(
              'driver'   => 'pgsql',
              'host'     => getenv('POSTGRESQL.HOST'),
              'database' => getenv('POSTGRESQL.DATABASE_NAME'),
              'username' => getenv('POSTGRESQL.DATABASE_USER'),
              'password' => getenv('POSTGRESQL.DATABASE_PASSWORD'),
              'charset'  => 'utf8',
              'prefix'   => '',
              'schema'   => 'public',
         ),

    ),

);

请注意,我不这样做

return getenv('APP_ENV') ?: 'local';

因为我希望它在我将应用部署到的每台服务器上都失败。

【讨论】:

  • 这是有道理的,不过我只是尝试了一下,得到了同样的错误。因为它使用 Web 服务器以外的其他用户,所以它应该可以访问它需要的环境变量吗?我刚刚重新阅读了我的 aws 支持案例,如果我获得了设置环境变量的方法,他说'另外需要注意的是,以这种方式设置的自定义环境变量将无法通过控制台进行修改。 '
  • 谢谢,有机会我会试试的
  • 今天刚开始尝试这个,我有一个问题。您是否为每个环境创建不同的 .enviroment 文件?在 git 中,我有一个 master、staging 和开发环境。如果 .enviroment 在 .gitignore 文件中,并且我从说开发切换到暂存,那么 .enviroment 文件是否与开发环境详细信息保持不变?
  • 您是否在同一主机中使用所有三个环境?我在每个文件夹/主机中创建一个 .environment 文件。我的开发环境有一个,和我的生产服务器上的完全不同,如果有人和我一起开发,在同一台服务器上,她的.environment开发文件在某些​​方面会与我的不同,可能数据库名称会有所不同,但几乎其他任何内容都可以相同,不会冲突。
  • 如果可行,您可以拥有 3 个不同的文件并通过 require __DIR__.'/../.environment.'.getenv('YOURENVIRONMENTVARIABLE') 选择正确的文件
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2014-02-11
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2010-10-05
  • 2017-01-25
相关资源
最近更新 更多