Heroku PHP开发 - 处理生产配置文件的最佳实践

时间:2015-01-14 05:37:40

标签: php heroku

在我自己的cms系统中,我有一个未在git中注册的配置文件(即它在.gitignore中列出),但我需要在服务器上提供该配置文件。

在Heroku环境中执行此操作的最佳做​​法是什么?

1 个答案:

答案 0 :(得分:1)

您可以立即想到几个选项;这里按照从最强到最低的偏好顺序列出:

  1. 使用config vars。它们将在$_ENVgetenv()中提供,这是最便携的方法。如果在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,有三个非常明显的优点:

    1. 如果您需要/需要更改配置设置,则无需重新部署应用
    2. 您可以部署相同的代码而无需更改例如生产和暂存应用程序(另请参阅heroku fork功能),更不用说本地开发环境,因为它们的配置变量只有不同
    3. 有时,配置变量的值可能会发生变化。例如,the Heroku Postgres HA feature may cause the value of DATABASE_URL to change。如果您将值硬编码到您的应用中,那么当发生这种情况时它就会停止运行并且您必须重新部署。如果您在运行时动态地从getenv("DATABASE_URL")读取,那么您将是安全的。
    4. 请记住,您可以自己设置任何配置变量,例如heroku config:set FOO=bar然后$foo = getenv("FOO")$foo = $_ENV["FOO"](如果变量/密钥不存在,前者的优点是不会发出通知,因此您可以执行$foo = getenv("FOO")?:"default value" )。

    5. 使用IncenteevParameterHandler

    6. 之类的内容
    7. config.php-dist

    8. 期间,使用composer compile stepconfig.php复制/移至git push heroku master(或类似)
    9. 执行与上述相同但使用Composer post-install-cmd;但是,每次有人composer install时都会运行,所以它可能不是你想要的。

    10. .gitignore删除配置:)

    11. P.S。只有选项#1在运行时读取配置变量,以便在配置变量值发生变化时自动安全。