Php 部署到Elastic Beanstalk时未识别环境变量

Php 部署到Elastic Beanstalk时未识别环境变量,php,laravel,amazon-web-services,environment-variables,amazon-elastic-beanstalk,Php,Laravel,Amazon Web Services,Environment Variables,Amazon Elastic Beanstalk,我正在尝试以开发模式将我的Laravel应用程序部署到Elastic Beanstalk。为了使应用程序在开发模式而不是生产模式下运行,我在我的/bootstrap/start.php文件中执行了以下操作: $env = $app->detectEnvironment(function() { return $_ENV['ENV_NAME']; }); 为了实际创建环境变量,我在以下路径中创建了一个.config文件:/.ebextensions/00environmentVar

我正在尝试以开发模式将我的Laravel应用程序部署到Elastic Beanstalk。为了使应用程序在开发模式而不是生产模式下运行,我在我的
/bootstrap/start.php
文件中执行了以下操作:

$env = $app->detectEnvironment(function() {
    return $_ENV['ENV_NAME'];
});
为了实际创建环境变量,我在以下路径中创建了一个
.config
文件:
/.ebextensions/00environmentVariables.config
,其中包含以下内容:

option_settings:
   - namespace: aws:elasticbeanstalk:application:environment
     option_name: ENV_NAME
     value: development
   - option_name: DB_HOST
     value: [redacted]
   - option_name: DB_PORT
     value: [redacted]
   - option_name: DB_NAME
     value: [redacted]
   - option_name: DB_USER
     value: [redacted]
   - option_name: DB_PASS
     value: [redacted]
当我从命令行运行
eb start
时,它会启动一个EC2实例并尝试配置它,这时它会告诉我它失败了。并检查日志。在日志中,我可以看到以下条目:

PHP注意:未定义索引:中的ENV_NAME /第28行的var/app/ondeck/bootstrap/start.php

注意:第28行/var/app/ondeck/bootstrap/start.php中未定义的索引:ENV_NAME

因此,出于某种原因,
ENV_NAME
环境变量不存在,即使我在
00environmentVariables.config
中指定了它。更奇怪的是,我可以看到环境变量是否存在于EB环境的软件配置设置下:

总结如下:

  • 通过查看日志,我知道正在解析我的.config文件
  • 出于某种原因,我的Laravel应用程序仍然不认为
    ENV_NAME
    eixsts
  • ENV_NAME
    eixsts,此环境的
    .config
    文件和我的Elastic Beanstalk设置中都有
编辑 好的,所以我发现当通过ApacheHTTP服务器为应用程序提供服务时,环境变量确实可以正常工作,但是当运行PHPCLI时,环境变量不存在

在上面的日志中,它抱怨运行
/usr/bin/composer.phar安装时
ENV_NAME
不存在

因此,出于某种原因,我的环境变量不存在于PHPCLI中,但在通过Apache提供服务时,它们确实可以正常工作

进一步编辑 因此,我使用SSH访问了在Elastic Beanstalk上托管我的Laravel应用程序的EC2实例,当我使用``printenv命令`时,我可以看到适当的环境变量:

ENV_NAME=development
但是,如果我执行
die(var_dump($_SERVER))并运行PHPCLI,我没有看到我定义的环境变量。与
$\u ENV
getenv()
的情况相同

为什么我不能在PHP CLI中访问我的环境变量,而我可以在Apache处理我的PHP脚本时访问它们

又一次编辑 我用一行代码创建了一个
test.php
文件:
die(var_dump($_ENV))


当我使用
php test.php
运行它时,我成功地获得了我的自定义环境变量,因此这似乎只是一个编写器问题,而不是php CLI问题。

我使用一个YAML脚本,该脚本从为ec2用户设置的现有变量中为根用户设置环境变量。使用扩展名
.config
将其添加到您的
.ebextensions
文件夹中

从那里可以运行PHPCLI,它将看到正确的环境变量

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/job_after_deploy.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      source /opt/elasticbeanstalk/support/envvars
      # Run PHP scripts here. #

根据XuDing对和的回答,我创建了一个作业,每5分钟创建一个.env文件

将以下内容添加到.ebextensions

   "/opt/elasticbeanstalk/hooks/appdeploy/post/91_set_create_app_env_file_job.sh":
  mode: "000755"
  owner: root
  group: root
  content: |
    #!/usr/bin/env bash

    echo "Removing any existing CRON jobs..."
    crontab -r

    APP_ENV=/var/app/current/.env
    EB_ENVVARS=/opt/elasticbeanstalk/support/envvars
    CONSTANTS=/var/app/current/.constants
    CRON_CMD="grep -oE '[^ ]+$' $EB_ENVVARS > $APP_ENV; cat $CONSTANTS >> $APP_ENV"

    echo "Creating .env file...."
    eval $CRON_CMD

    echo "Scheduling .env file updater job to run every 5 minutes..."
    (crontab -l 2>/dev/null; echo "*/5 * * * * $CRON_CMD")| crontab -
我这样做的原因是您可能希望通过AWS UI控制台更新环境变量


在我看来,这是最好的解决方案。

听起来像是用户的问题。也许apache运行的用户与您选择的用户不同。可能是root vs.ec2-user。是的,正是这样,出于某种原因,我在Elastic Beanstalk上定义的环境变量只对
ec2用户
用户和web服务器可用,我需要将环境变量设置为系统范围。我可能感兴趣:@ChrisWhite为什么需要将VAR设置为系统范围?EB设计用于与一组严格的用户一起工作,每个用户都有自己的角色。使用SSH不会很好地工作。是否有关于这个问题的任何信息,我似乎遇到了相同的问题。