在我自己的cms系统中,我有一个未在git中注册的配置文件(即它在.gitignore中列出),但我需要在服务器上提供该配置文件。
在 Heroku 环境中执行此操作的最佳实践是什么?
您有几个立即想到的选项;此处按从最强到最低的优先顺序显示:
-
使用配置变量。它们将以
$_ENV
或通过getenv()
提供,这是最便携的方法。如果您在 Heroku 上添加任何附加组件,相应的信息将被设置为配置变量,以便您可以在运行时从环境中读取。例如,当你heroku addons:add heroku-postgresql
时,会有一个DATABASE_URL
配置变量,大致如下所示:$ heroku config | grep DATABASE_URL DATABASE_URL: postgres://user3123:passkja83kd8@ec2-117-21-174-214.compute-1.amazonaws.com:6212/db982398
然后,您可以从环境中读取此信息并将其解析为 URL 以确定所有连接详细信息:
$dbinfo = parse_url(getenv("DATABASE_URL"));
这同样适用于任何附加组件。如果您从附加组件商店添加 RedisToGo 附加组件,您将拥有一个包含连接信息的
REDISTOGO_URL
env var。如果添加 Mandrill 加载项,您将拥有一个可用于与 API 交互的MANDRILL_APIKEY
。这是推荐的十二因素实践,具有三个非常明显的优势:
- 如果要/需要更改配置设置,则不必重新替换应用
- 您可以部署相同的代码,而无需更改生产和暂存应用程序(另请参阅
heroku fork
功能),更不用说本地开发环境了,因为它们仅在配置变量上有所不同 - 有时,配置 var 的值可能会更改。例如,Heroku Postgres HA 功能可能会导致
DATABASE_URL
的值发生变化。如果将值硬编码到应用中,则在发生这种情况时,该值将下降,你必须重新部署。如果您在运行时动态读取getenv("DATABASE_URL")
,您将是安全的。
请记住,您可以自己设置任何配置变量,例如
heroku config:set FOO=bar
然后$foo = getenv("FOO")
或$foo = $_ENV["FOO"]
(前者的优点是如果变量/键不存在,则不会抛出通知,因此您可以执行$foo = getenv("FOO")?:"default value"
)。 -
使用类似 IncenteevParameterHandler 的东西
-
在
git push heroku master
期间,使用composer compile
步骤将config.php-dist
复制/移动到config.php
(或类似) -
执行与上述相同的操作,但使用作曲家
post-install-cmd
;但是,每次有人执行composer install
时都会运行,因此这可能不是您想要的。 -
从
.gitignore
:)中删除配置
附言只有选项 #1 在运行时读取配置变量,因此在配置变量的值发生变化时自动安全。