Использовать config vars. Они будут доступны в $_ENV
или через getenv()
, и это самый портативный подход. Если вы добавите надстройку на Heroku, соответствующая информация будет настроена как config vars, чтобы вы могли читать ее из среды во время выполнения. Например, когда вы heroku addons:add heroku-postgresql
, там будете DATABASE_URL
конфигурации вара, который выглядит примерно так:
$ heroku config | grep DATABASE_URL
DATABASE_URL: postgres://user3123:[email protected]:6212/db982398
Вы можете прочитать эту информацию из окружающей среды, и разобрать его как URL, чтобы определить все детали соединения:
$dbinfo = parse_url(getenv("DATABASE_URL"));
То же самое относится к любому дополнению. Если вы добавите надстройку RedisToGo из хранилища надстроек, у вас будет env var с информацией о подключении. Если вы добавите надстройку Mandrill, у вас будет MANDRILL_APIKEY
, который вы можете использовать для взаимодействия с API.
Это рекомендуется Twelve-Factor practice и имеет три очень явные преимущества:
- если вы хотите/необходимость изменить настройки конфигурации, то вам не придется повторно reploy приложение
- вы можете развернуть тот же код без изменений, например (также см. функцию
heroku fork
), не говоря уже о локальных средах разработчиков, поскольку они отличаются только в их конфигурационных версиях
- иногда, значения конфигурационных варов могут меняться. Например, the Heroku Postgres HA feature may cause the value of
DATABASE_URL
to change. Если вы скорректируете значение в своем приложении, оно исчезнет, когда это произойдет, и вам придется повторно развернуть. Если вы динамически во время выполнения читаете от getenv("DATABASE_URL")
, вы будете в безопасности.
Помните, что вы можете установить любой config var самостоятельно, например. heroku config:set FOO=bar
, а затем $foo = getenv("FOO")
или $foo = $_ENV["FOO"]
(первое имеет преимущество не бросать уведомление, если переменная/ключ не существует, поэтому вы можете сделать $foo = getenv("FOO")?:"default value"
).
У вас была возможность взглянуть на ответ? – dzuelke