Amazon web services 命令行上的laravel环境与浏览器中的不同
我已将我的laravel应用程序部署到弹性豆茎环境中。此应用程序使用bootstrap/start.php中的这段代码检测其环境Amazon web services 命令行上的laravel环境与浏览器中的不同,amazon-web-services,laravel-4,amazon-elastic-beanstalk,Amazon Web Services,Laravel 4,Amazon Elastic Beanstalk,我已将我的laravel应用程序部署到弹性豆茎环境中。此应用程序使用bootstrap/start.php中的这段代码检测其环境 $env = $app->detectEnvironment(function () { return getenv('APP_ENV') ?: 'local'; }); 当elastic beanstalk启动时,它会运行我设置的配置文件,以检测是否设置了参数。在本例中,我将此参数设置为development,然后配置文件基于此设置环境变量 APP_
$env = $app->detectEnvironment(function () {
return getenv('APP_ENV') ?: 'local';
});
当elastic beanstalk启动时,它会运行我设置的配置文件,以检测是否设置了参数。在本例中,我将此参数设置为development,然后配置文件基于此设置环境变量
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,也会返回local。我非常确定这个变量是定义的,因为当浏览器中出现laravel错误时,我可以在服务器/请求数据中看到具有值开发的变量,以及在环境启动时创建的其他环境变量
我错过了什么
经过编辑,包括基于antonios答案的个性化解决方案
.环境
<?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;
}
}
当你跑的时候
php artisan migrate
php在不同的用户(而不是web服务器)下运行,因此您需要:
php artisan migrate --env=development
编辑
cli和web出现问题是我不使用这些web服务器env-vars的原因之一。这是我在环境中的工作方式:
在应用程序的根目录中创建.environment文件并定义环境:
<?php
return array(
'APP_ENV' => 'development',
'POSTGRESQL.HOST' => 'localhost',
'POSTGRESQL.DATABASE_NAME' => 'laraveldatabase',
'POSTGRESQL.DATABASE_USER' => 'laraveluser',
'POSTGRESQL.DATABASE_PASSWORD' => '!Bassw0rT',
);
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',
),
),
);
因为我想让它在我部署应用程序的每台服务器上都失败。这是有道理的,我只是尝试了一下,却得到了同样的错误。因为它使用的是web服务器以外的其他用户,所以它是否应该访问所需的环境变量?我刚刚重新阅读了我的aws支持案例,当时我得到了设置eniroment变量的方法,他说“另外一件值得注意的事情是,以这种方式设置的自定义环境变量将无法通过控制台进行修改。”谢谢,当我有机会今天开始尝试时,我会尝试一下,我有一个问题。是否为每个环境创建不同的.environment文件?在git中,我有一个master、staging和development环境。如果.Environment在.gitignore文件中,并且我从“开发”切换到“暂存”,那么.Environment文件不会随着开发环境的详细信息而保持不变吗?您是否在同一主机中使用所有三个环境?我在每个文件夹/主机中创建一个.environment文件。我的开发环境有一个,它与我在生产服务器上的开发环境完全不同,如果有人与我一起开发,在同一台服务器上,她的.environment开发文件在某些方面与我的不同,可能数据库名称不同,但是几乎其他任何东西都可以是相同的,不会发生冲突。如果它起作用,那么您可以有3个不同的文件,然后通过执行
require\uuu DIR\uu./...environment.'.getenv('YOURENVIRONMENTVARIABLE')
Ok,然后在git中获得所有变量????我和你的情况完全一样
<?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';