错误500“;PHP致命错误:未捕获运行时异常:未定义APP_ENV环境变量;关于Symfony应用程序启动

错误500“;PHP致命错误:未捕获运行时异常:未定义APP_ENV环境变量;关于Symfony应用程序启动,symfony,environment-variables,symfony4,Symfony,Environment Variables,Symfony4,我最近在prod服务器上部署了一个新的Symfony 4项目,在那里我(通过ssh)将APP_ENV和APP_SECRET等设置为环境变量。两个命令printenv和set都在输出中列出了这些变量,所以我认为这一部分应该一切正常 但是,我在站点上收到一个错误500,返回的日志PHP致命错误:Uncaught RuntimeException:APP_ENV环境变量未定义。您需要为配置定义环境变量,或添加“symfony/dotenv”作为编写器依赖项,以从.env文件加载变量。 我错过了什么 您

我最近在prod服务器上部署了一个新的Symfony 4项目,在那里我(通过ssh)将
APP_ENV
APP_SECRET
等设置为环境变量。两个命令
printenv
set
都在输出中列出了这些变量,所以我认为这一部分应该一切正常

但是,我在站点上收到一个错误500,返回的日志
PHP致命错误:Uncaught RuntimeException:APP_ENV环境变量未定义。您需要为配置定义环境变量,或添加“symfony/dotenv”作为编写器依赖项,以从.env文件加载变量。


我错过了什么

您的web服务器将无法使用系统变量。该变量应在vhost/htaccess文件中定义。我假设您使用的是Apache。

系统变量对您的web服务器不可用。该变量应在vhost/htaccess文件中定义。我假设您使用的是Apache。

如果您使用的是nginx,则必须在池配置文件的末尾定义

php5

/etc/php5/fpm/pool.d/www.conf

php7

/etc/php/7.1/fpm/pool.d/www.conf


如果您使用的是nginx,则必须在池配置文件的末尾定义

php5

/etc/php5/fpm/pool.d/www.conf

php7

/etc/php/7.1/fpm/pool.d/www.conf

[EDIT 2020]-->使用“symfony/dotenv”

根据官方文档,您可以做的是将composer文件中的“symfony/dotenv”从require dev移动到require,这样它也可以安装在生产环境中。然后可以继续使用.env.local文件

如果您不想或不能使用“symfony/dotenv”

对于Apache和Ubuntu,首先需要激活

sudo a2enmod env
sudo service apache2 restart
然后将environment变量放入.htacess或vhost配置文件中。对于SF4,.htacess在/public中,下面是语法。我不知道顺序是否重要,我会说不,所以我把它们添加到文件的顶部

SetEnv APP_ENV prod
SetEnv APP_SECRET fjsdkfj...
SetEnv DATABASE_URL mysql://...
下面是一些随机的有用技巧:

  • 您不想提交.htaccess文件。将其添加到部署工具的共享部分。在我的情况下(轻松部署捆绑包)

  • 您需要在/etc/environment中复制环境变量,以便composer可以使用它。。。这是一个真正的麻烦,因为现在你复制了你的变量。所以Symfony团队说env变量更好,因为它更安全、更标准。但复制信息一点也不安全。也许我做错了(这是完全可能的)。如果你知道如何避免这种情况,请分享。
    printenv
    命令将显示其配置是否正确

  • 如果在生产环境中使用easy deploy bundle,请删除composer上的--quiet选项,以便在失败时显示清晰的错误消息(例如,因为它找不到env变量)。还要检查--此处没有dev选项,因此它不会安装dotenv包

    ->composerInstallFlags('--prefer-dist --no-interaction --no-dev')
    
[EDIT 2020]-->使用“symfony/dotenv”

根据官方文档,您可以做的是将composer文件中的“symfony/dotenv”从require dev移动到require,这样它也可以安装在生产环境中。然后可以继续使用.env.local文件

如果您不想或不能使用“symfony/dotenv”

对于Apache和Ubuntu,首先需要激活

sudo a2enmod env
sudo service apache2 restart
然后将environment变量放入.htacess或vhost配置文件中。对于SF4,.htacess在/public中,下面是语法。我不知道顺序是否重要,我会说不,所以我把它们添加到文件的顶部

SetEnv APP_ENV prod
SetEnv APP_SECRET fjsdkfj...
SetEnv DATABASE_URL mysql://...
下面是一些随机的有用技巧:

  • 您不想提交.htaccess文件。将其添加到部署工具的共享部分。在我的情况下(轻松部署捆绑包)

  • 您需要在/etc/environment中复制环境变量,以便composer可以使用它。。。这是一个真正的麻烦,因为现在你复制了你的变量。所以Symfony团队说env变量更好,因为它更安全、更标准。但复制信息一点也不安全。也许我做错了(这是完全可能的)。如果你知道如何避免这种情况,请分享。
    printenv
    命令将显示其配置是否正确

  • 如果在生产环境中使用easy deploy bundle,请删除composer上的--quiet选项,以便在失败时显示清晰的错误消息(例如,因为它找不到env变量)。还要检查--此处没有dev选项,因此它不会安装dotenv包

    ->composerInstallFlags('--prefer-dist --no-interaction --no-dev')
    

我太笨了!谢谢!我真傻!谢谢!