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

Heroku PHP development - Best practice to deal with production config file

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

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

您会立即想到几个选项;此处按从强到低的优先顺序显示:

  1. 使用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,具有三个非常明显的优势:

    1. 如果您 want/need 更改配置设置,则无需重新部署您的应用程序
    2. 您可以在不更改的情况下部署相同的代码,例如一个生产和一个暂存应用程序(另请参阅 heroku fork 功能),更不用说本地开发环境了,因为它们仅在配置变量上有所不同
    3. 有时,配置变量的值可能会改变。例如,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" ).

  2. 使用IncenteevParameterHandler

  3. git push heroku master

    期间使用composer compile step到copy/move一个config.php-distconfig.php(或类似的)
  4. 与上面相同,但使用 Composer post-install-cmd;但是,每次有人这样做时都会 运行 composer install,所以这可能不是您想要的。

  5. 删除 .gitignore 的配置 :)

P.S。只有选项 #1 在 运行 时读取配置变量,因此在配置变量的值发生变化时你会自动安全。