A maneira mais fácil é, como você disse, usar um arquivo de configuração.
Muitos frameworks usam isso (Zend , CakePHP , Kohana , etc) e é a maneira mais comum de fazer as coisas (mesmo em um ambiente não PHP como ASP.NET com seu
web.config
arquivos). Isso permite que você também copie os valores de configuração de um ambiente para outro apenas copiando os arquivos para o site, o que é um benefício em relação a depender de variáveis de ambiente de configuração do servidor (que podem ser perdidas e esquecidas muito rapidamente). Você não precisa se preocupar com a ofuscação da senha, pois não é um arquivo acessível pelo mundo, certamente não deve ser acessível pela web. O que quero dizer com isso é que você a) Diga ao seu servidor web para não servir seu arquivo de configuração ( IIS já faz isso com
web.config
arquivos e atende a um status HTTP 404.8 em vez do conteúdo) ou b) Mova-o para fora do diretório servido pela web. Se alguém puder ver seu arquivo de configuração, é pior do que tê-lo em seu código-fonte. Também será uma boa ideia ter uma versão base (vazia / padrão) do arquivo de configuração e separá-la por ambientes, para que você possa ter um arquivo de configuração diferente para plataformas de produção, desenvolvimento e teste.
Uma variável de ambiente é a maneira mais comum de diferenciar esses ambientes, algo como o código abaixo:
// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
// Copy from web server to PHP constant
define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}
if (!defined('ENVIRONMENT')) {
// Default to development
define('ENVIRONMENT', 'development');
}
// Load in default configuration values
require_once 'config.default.php';
// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';
Outra maneira bastante comum é usar um arquivo de configuração XML e ler apenas os valores necessários conforme apropriado (armazenando uma cópia em cache do arquivo de configuração na memória). Isso pode ser facilmente restrito a apenas carregar determinados valores, em vez de permitir a inclusão arbitrária de arquivos PHP e, em geral, é uma solução melhor na minha opinião, mas o acima deve ajudá-lo a começar na direção certa.
Você provavelmente vai querer seu VCS para ignorar o arquivo. Por outro lado, você pode querer que um esqueleto do arquivo, ou um com padrões razoáveis (o último não se aplica aos dados de login, é claro), seja controlado por versão. Uma maneira comum de lidar com isso é ter um arquivo de configuração de modelo com check-in, e o procedimento de instalação copia esse arquivo para o local do arquivo de configuração real, onde ele é customizado. Este pode ser um processo manual ou automatizado.
(Embora um pouco não relacionado à questão principal, a introdução de uma constante para seu ambiente permite que você faça algumas outras coisas legais, como adiar uma implementação de correio falso em vez de um SMTP one, mas é claro que isso também pode ser feito com um arquivo de configuração)