Il modo più semplice è, come hai detto, utilizzare un file di configurazione.
Molti framework lo usano (Zend
, CakePHP
, Kohana
, ecc) ed è il modo più comune di fare le cose (anche in un ambiente non PHP come ASP.NET con il suo web.config
File). Ciò ti consente anche di copiare i valori di configurazione da un ambiente all'altro semplicemente copiando i file per il sito, il che è un vantaggio rispetto al fare affidamento sulle variabili di ambiente di configurazione del server (che possono essere perse e dimenticate molto rapidamente).
Non dovresti preoccuparti dell'offuscamento della password poiché non è un file accessibile al mondo, certamente non dovrebbe essere accessibile dal Web. Ciò che intendo con questo è che dovresti a) Dire al tuo server web di non servire il tuo file di configurazione ( IIS
lo fa già con web.config
file e serve uno stato HTTP 404.8 invece del contenuto) oppure b) Spostalo al di fuori della directory del servizio Web. Se qualcuno può vedere il tuo file di configurazione, è peggio che averlo nel tuo codice sorgente.
Sarà anche una buona idea avere una versione di base (vuota/predefinita) del file di configurazione e separarla per ambienti, in modo da poter avere un file di configurazione diverso per le piattaforme di produzione, sviluppo e test.
Una variabile di ambiente è il modo più comune per distinguere tra questi ambienti, qualcosa come il codice seguente:
// 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';
Un altro modo abbastanza comune è utilizzare un file di configurazione XML e leggere solo i valori di cui hai bisogno in modo appropriato (memorizzare una copia cache del file di configurazione in memoria). Questo può essere facilmente limitato al caricamento solo di determinati valori, piuttosto che consentire l'inclusione arbitraria di file PHP ed è nel complesso una soluzione migliore secondo me, ma quanto sopra dovrebbe farti iniziare nella giusta direzione.
Probabilmente vorrai il tuo VCS per ignorare il file. D'altra parte, potresti volere che uno scheletro del file, o uno con valori predefiniti ragionevoli (quest'ultimo non si applica ai dati di accesso, ovviamente), sia controllato dalla versione. Un modo comune per affrontarlo è avere un file di configurazione del modello archiviato e la procedura di installazione copia quel file nella posizione del file di configurazione reale, dove è personalizzato. Questo può essere un processo manuale o automatizzato.
(Anche se in qualche modo non correlato alla domanda principale, l'introduzione di una costante per il tuo ambiente ti consente di fare altre cose interessanti come rinviare a un'implementazione di posta falsa invece di un SMTP uno, ma ovviamente questo potrebbe essere fatto anche con un file di configurazione)