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


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

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

在 Heroku 环境中执行此操作的最佳实践是什么?

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

  1. 使用配置变量。它们将以$_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

    这是推荐的十二因素实践,具有三个非常明显的优势:

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

  2. 使用类似 IncenteevParameterHandler 的东西

  3. git push heroku master期间,使用composer compile步骤将config.php-dist复制/移动到config.php(或类似)

  4. 执行与上述相同的操作,但使用作曲家post-install-cmd;但是,每次有人执行composer install时都会运行,因此这可能不是您想要的。

  5. .gitignore :)中删除配置

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