Le opzioni che vedo con relativi meriti / punti deboli sono:
Meccanismi basati su file
Questi richiedono che il codice cerchi in posizioni specifiche per trovare il file ini. Questo è un problema difficile da risolvere e che si presenta sempre nelle grandi applicazioni PHP. Tuttavia, probabilmente dovrai risolvere il problema per trovare il codice PHP che viene incorporato / riutilizzato in fase di esecuzione.
Gli approcci comuni a questo sono usare sempre le directory relative, o cercare dalla directory corrente verso l'alto per trovare un file denominato esclusivamente nella directory di base dell'applicazione.
I formati di file comuni utilizzati per i file di configurazione sono codice PHP, file formattati ini, JSON, XML, YAML e PHP serializzato
Codice PHP
Ciò fornisce un'enorme quantità di flessibilità per rappresentare diverse strutture di dati e (supponendo che venga elaborato tramite include o require) il codice analizzato sarà disponibile dalla cache del codice operativo, offrendo un vantaggio in termini di prestazioni.
L'include_path fornisce un mezzo per astrarre i potenziali posizioni dei file senza fare affidamento su codice aggiuntivo.
D'altra parte, uno dei motivi principali per separare la configurazione dal codice è separare le responsabilità. Fornisce un percorso per l'inserimento di codice aggiuntivo nel runtime.
Se la configurazione viene creata da uno strumento, potrebbe essere possibile convalidare i dati nello strumento, ma non esiste una funzione standard per sfuggire ai dati da incorporare nel codice PHP come esiste per HTML, URL, istruzioni MySQL, comandi shell ... .
Dati serializzati
Questo è relativamente efficiente per piccole quantità di configurazione (fino a circa 200 elementi) e consente l'uso di qualsiasi struttura dati PHP. Richiede pochissimo codice per creare / analizzare il file di dati (quindi puoi invece spendere i tuoi sforzi per garantire che il file sia scritto solo con l'autorizzazione appropriata).
L'escape del contenuto scritto nel file viene gestita automaticamente.
Poiché è possibile serializzare gli oggetti, crea un'opportunità per invocare il codice semplicemente leggendo il file di configurazione (il metodo magico __wakeup).
File strutturato
Archiviarlo come file INI come suggerito da Marcel o JSON o XML fornisce anche una semplice API per mappare il file in una struttura dati PHP (e con l'eccezione di XML, per sfuggire ai dati e creare il file) eliminando la chiamata del codice vulnerabilità utilizzando dati PHP serializzati.
Avrà caratteristiche di prestazione simili ai dati serializzati.
Archiviazione del database
Questo è meglio considerato quando si dispone di un'enorme quantità di configurazione ma si è selettivi in ciò che è necessario per l'attività corrente: sono stato sorpreso di scoprire che con circa 150 elementi di dati era più veloce recuperare i dati da un'istanza MySQL locale rispetto a deserializzare un file di dati.
OTOH non è un buon posto per archiviare le credenziali che usi per connetterti al tuo database!
L'ambiente di esecuzione
Puoi impostare i valori nell'ambiente di esecuzione in cui è in esecuzione PHP.
Ciò rimuove qualsiasi requisito per il codice PHP di cercare in un luogo specifico per la configurazione. OTOH non si adatta bene a grandi quantità di dati ed è difficile da modificare universalmente in fase di esecuzione.
Sul cliente
Un posto che non ho menzionato per memorizzare i dati di configurazione è nel client. Anche in questo caso il sovraccarico di rete significa che questo non si adatta bene a grandi quantità di configurazione. E poiché l'utente finale ha il controllo sui dati, questi devono essere archiviati in un formato in cui qualsiasi manomissione sia rilevabile (ovvero con una firma crittografica) e non deve contenere alcuna informazione compromessa dalla sua divulgazione (ovvero crittografata in modo reversibile).
Al contrario, questo ha molti vantaggi per la memorizzazione di informazioni sensibili di proprietà dell'utente finale: se non le si memorizza sul server, non possono essere rubate da lì.
Directory di rete
Un altro luogo interessante per memorizzare le informazioni di configurazione è in DNS / LDAP. Questo funzionerà per un piccolo numero di piccole informazioni - ma non è necessario attenersi alla prima forma normale - considera, ad esempio, SPF .
L'infrastruttura supporta la memorizzazione nella cache, la replica e la distribuzione. Quindi funziona bene per infrastrutture molto grandi.
Sistemi di controllo della versione
La configurazione, come il codice, dovrebbe essere gestita e la versione controllata, quindi ottenere la configurazione direttamente dal tuo sistema VC è una soluzione praticabile. Ma spesso ciò comporta un notevole sovraccarico delle prestazioni, quindi la memorizzazione nella cache potrebbe essere consigliabile.