As opções que vejo com méritos / pontos fracos relativos são:
Mecanismos baseados em arquivos
Isso requer que seu código procure em locais específicos para encontrar o arquivo ini. Este é um problema difícil de resolver e que sempre surge em grandes aplicativos PHP. No entanto, você provavelmente precisará resolver o problema para encontrar o código PHP que é incorporado / reutilizado no tempo de execução.
As abordagens comuns para isso são sempre usar diretórios relativos ou pesquisar a partir do diretório atual para encontrar um arquivo nomeado exclusivamente no diretório base do aplicativo.
Os formatos de arquivo comuns usados para arquivos de configuração são código PHP, arquivos formatados ini, JSON, XML, YAML e PHP serializado
Código PHP
Isso fornece uma grande flexibilidade para representar diferentes estruturas de dados e (assumindo que seja processado por meio de include ou require) o código analisado estará disponível no cache de opcode - proporcionando um benefício de desempenho.
O include_path fornece um meio de abstrair os locais potenciais do arquivo sem depender de código adicional.
Por outro lado, um dos principais motivos para separar a configuração do código é separar responsabilidades. Ele fornece uma rota para injetar código adicional no tempo de execução.
Se a configuração for criada a partir de uma ferramenta, pode ser possível validar os dados na ferramenta, mas não há uma função padrão para escapar os dados para incorporação no código PHP como existe para HTML, URLs, instruções MySQL, comandos shell ... .
Dados serializados
Isso é relativamente eficiente para pequenas quantidades de configuração (até cerca de 200 itens) e permite o uso de qualquer estrutura de dados PHP. Requer muito pouco código para criar / analisar o arquivo de dados (então você pode, em vez disso, despender seus esforços para garantir que o arquivo seja escrito apenas com a autorização apropriada).
O escape do conteúdo gravado no arquivo é tratado automaticamente.
Uma vez que você pode serializar objetos, isso cria uma oportunidade para invocar código simplesmente lendo o arquivo de configuração (o método mágico __wakeup).
Arquivo estruturado
Armazená-lo como um arquivo INI conforme sugerido por Marcel ou JSON ou XML também fornece uma API simples para mapear o arquivo em uma estrutura de dados PHP (e com exceção de XML, para escapar dos dados e criar o arquivo), eliminando a invocação do código vulnerabilidade usando dados PHP serializados.
Ele terá características de desempenho semelhantes aos dados serializados.
Armazenamento de banco de dados
Isso é melhor considerado quando você tem uma grande quantidade de configuração, mas é seletivo no que é necessário para a tarefa atual - fiquei surpreso ao descobrir que em cerca de 150 itens de dados, era mais rápido recuperar os dados de uma instância local do MySQL do que desserializar um arquivo de dados.
OTOH não é um bom lugar para armazenar as credenciais que você usa para se conectar ao seu banco de dados!
O ambiente de execução
Você pode definir valores no ambiente de execução em que o PHP está sendo executado.
Isso remove qualquer requisito para o código PHP procurar em um local específico para a configuração. O OTOH não se adapta bem a grandes quantidades de dados e é difícil de alterar universalmente em tempo de execução.
No cliente
Um lugar que não mencionei para armazenar dados de configuração é no cliente. Novamente, a sobrecarga da rede significa que isso não se ajusta bem a grandes quantidades de configuração. E uma vez que o usuário final tem controle sobre os dados, eles devem ser armazenados em um formato onde qualquer violação seja detectável (ou seja, com uma assinatura criptográfica) e não deve conter nenhuma informação que seja comprometida por sua divulgação (ou seja, criptografada de forma reversível).
Por outro lado, isso tem muitos benefícios para armazenar informações confidenciais de propriedade do usuário final - se você não as estiver armazenando no servidor, elas não poderão ser roubadas de lá.
Diretórios de rede
Outro lugar interessante para armazenar informações de configuração é no DNS / LDAP. Isso funcionará para um pequeno número de pequenos pedaços de informação - mas você não precisa se ater à 1ª forma normal - considere, por exemplo, SPF .
A infra-estrutura suporta armazenamento em cache, replicação e distribuição. Por isso, funciona bem para grandes infraestruturas.
Sistemas de controle de versão
A configuração, como o código, deve ser gerenciada e controlada por versão - portanto, obter a configuração diretamente do seu sistema VC é uma solução viável. Mas geralmente isso vem com uma sobrecarga de desempenho significativa, portanto, o cache pode ser aconselhável.