在我自己的cms系统中,我有一个未在git中注册的配置文件(即它在.gitignore中列出),但我需要在服务器上提供该配置文件。
在Heroku环境中执行此操作的最佳做法是什么?
答案 0 :(得分:1)
您可以立即想到几个选项;这里按照从最强到最低的偏好顺序列出:
使用config vars。它们将在$_ENV
或getenv()
中提供,这是最便携的方法。如果在Heroku上添加任何加载项,相应的信息将被设置为config vars,以便您可以在运行时从环境中读取。例如,当您heroku addons:add heroku-postgresql
时,会有一个DATABASE_URL
配置var看起来大致如下:
$ 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插件,则您可以使用MANDRILL_APIKEY
与API进行互动。
这是推荐的Twelve-Factor practice,有三个非常明显的优点:
heroku fork
功能),更不用说本地开发环境,因为它们的配置变量只有不同DATABASE_URL
to change。如果您将值硬编码到您的应用中,那么当发生这种情况时它就会停止运行并且您必须重新部署。如果您在运行时动态地从getenv("DATABASE_URL")
读取,那么您将是安全的。请记住,您可以自己设置任何配置变量,例如heroku config:set FOO=bar
然后$foo = getenv("FOO")
或$foo = $_ENV["FOO"]
(如果变量/密钥不存在,前者的优点是不会发出通知,因此您可以执行$foo = getenv("FOO")?:"default value"
)。
在config.php-dist
composer compile
step将config.php
复制/移至git push heroku master
(或类似)
执行与上述相同但使用Composer post-install-cmd
;但是,每次有人composer install
时都会运行,所以它可能不是你想要的。
从.gitignore
删除配置:)
P.S。只有选项#1在运行时读取配置变量,以便在配置变量值发生变化时自动安全。