Heroku PHP 开发 - 处理生产配置文件的最佳实践
Heroku PHP development - Best practice to deal with production config file
在我自己的 cms 系统中,我有一个未在 git 中注册的配置文件(即它列在 .gitignore 中),但我需要有该配置文件在服务器上可用。
在 Heroku 环境中执行此操作的最佳做法是什么?
您会立即想到几个选项;此处按从强到低的优先顺序显示:
使用config vars。它们将在 $_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 附加组件,您将拥有一个 MANDRILL_APIKEY
,可用于与 API.
进行交互
这是推荐的Twelve-Factor practice,具有三个非常明显的优势:
- 如果您 want/need 更改配置设置,则无需重新部署您的应用程序
- 您可以在不更改的情况下部署相同的代码,例如一个生产和一个暂存应用程序(另请参阅
heroku fork
功能),更不用说本地开发环境了,因为它们仅在配置变量上有所不同
- 有时,配置变量的值可能会改变。例如,the Heroku Postgres HA feature may cause the value of
DATABASE_URL
to change。如果您将值硬编码到您的应用程序中,那么当发生这种情况时它会下降并且您必须重新部署。如果您在 运行 时间从 getenv("DATABASE_URL")
动态读取,您将是安全的。
请记住,您可以自己设置任何配置变量,例如heroku config:set FOO=bar
然后是 $foo = getenv("FOO")
或 $foo = $_ENV["FOO"]
(前者的优点是如果 variable/key 不存在则不会发出通知,因此您可以 $foo = getenv("FOO")?:"default value"
).
在git push heroku master
期间使用composer compile
step到copy/move一个config.php-dist
到config.php
(或类似的)
与上面相同,但使用 Composer post-install-cmd
;但是,每次有人这样做时都会 运行 composer install
,所以这可能不是您想要的。
删除 .gitignore
的配置 :)
P.S。只有选项 #1 在 运行 时读取配置变量,因此在配置变量的值发生变化时你会自动安全。
在我自己的 cms 系统中,我有一个未在 git 中注册的配置文件(即它列在 .gitignore 中),但我需要有该配置文件在服务器上可用。
在 Heroku 环境中执行此操作的最佳做法是什么?
您会立即想到几个选项;此处按从强到低的优先顺序显示:
使用config vars。它们将在
$_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 附加组件,您将拥有一个MANDRILL_APIKEY
,可用于与 API.这是推荐的Twelve-Factor practice,具有三个非常明显的优势:
- 如果您 want/need 更改配置设置,则无需重新部署您的应用程序
- 您可以在不更改的情况下部署相同的代码,例如一个生产和一个暂存应用程序(另请参阅
heroku fork
功能),更不用说本地开发环境了,因为它们仅在配置变量上有所不同 - 有时,配置变量的值可能会改变。例如,the Heroku Postgres HA feature may cause the value of
DATABASE_URL
to change。如果您将值硬编码到您的应用程序中,那么当发生这种情况时它会下降并且您必须重新部署。如果您在 运行 时间从getenv("DATABASE_URL")
动态读取,您将是安全的。
请记住,您可以自己设置任何配置变量,例如
heroku config:set FOO=bar
然后是$foo = getenv("FOO")
或$foo = $_ENV["FOO"]
(前者的优点是如果 variable/key 不存在则不会发出通知,因此您可以$foo = getenv("FOO")?:"default value"
).在
期间使用git push heroku master
composer compile
step到copy/move一个config.php-dist
到config.php
(或类似的)与上面相同,但使用 Composer
post-install-cmd
;但是,每次有人这样做时都会 运行composer install
,所以这可能不是您想要的。删除
.gitignore
的配置 :)
P.S。只有选项 #1 在 运行 时读取配置变量,因此在配置变量的值发生变化时你会自动安全。