Варианты, которые я вижу с относительными достоинствами / недостатками, следующие:
Файловые механизмы
Это требует, чтобы ваш код просматривал определенные места, чтобы найти ini-файл. Это сложная для решения проблема, которая всегда возникает в больших PHP-приложениях. Однако вам, вероятно, потребуется решить проблему, чтобы найти код PHP, который будет включен / повторно использован во время выполнения.
Обычные подходы к этому - всегда использовать относительные каталоги или выполнять поиск из текущего каталога вверх, чтобы найти файл, названный исключительно в базовом каталоге приложения.
Общие форматы файлов, используемые для файлов конфигурации, - это код PHP, файлы в формате ini, JSON, XML, YAML и сериализованный PHP.
Код PHP
Это обеспечивает огромную гибкость для представления различных структур данных, и (при условии, что он обрабатывается с помощью include или require) проанализированный код будет доступен из кеша кодов операций, что дает преимущество в производительности.
Include_path предоставляет средства для абстрагирования потенциальных местоположений файла , не полагаясь на дополнительном коде.
С другой стороны, одна из основных причин отделения конфигурации от кода - разделение ответственности. Он обеспечивает путь для внедрения дополнительного кода в среду выполнения.
Если конфигурация создается с помощью инструмента, можно проверить данные в инструменте, но нет стандартной функции для экранирования данных для встраивания в код PHP, которая существует для HTML, URL-адресов, операторов MySQL, команд оболочки ... .
Сериализованные данные
Это относительно эффективно для небольших объемов конфигурации (примерно до 200 элементов) и позволяет использовать любую структуру данных PHP. Для создания / анализа файла данных требуется очень мало кода (так что вместо этого вы можете приложить усилия для того, чтобы файл был записан только с соответствующей авторизацией).
Экранирование содержимого, записанного в файл, выполняется автоматически.
Поскольку вы можете сериализовать объекты, это создает возможность для вызова кода, просто читая файл конфигурации (магический метод __wakeup).
Структурированный файл
Сохранение его в виде файла INI, как было предложено Марселем, или JSON, или XML, также предоставляет простой API для сопоставления файла со структурой данных PHP (и, за исключением XML, для экранирования данных и создания файла), при этом исключая вызов кода. уязвимость, использующая сериализованные данные PHP.
Он будет иметь характеристики производительности, аналогичные сериализованным данным.
Хранилище базы данных
Это лучше всего рассматривать, когда у вас есть огромное количество настроек, но вы избирательно выбираете то, что необходимо для текущей задачи - я был удивлен, обнаружив, что примерно со 150 элементами данных было быстрее получить данные из локального экземпляра MySQL, чем из десериализовать файл данных.
OTOH - не лучшее место для хранения учетных данных, которые вы используете для подключения к базе данных!
Среда исполнения
Вы можете установить значения в среде выполнения, в которой работает PHP.
Это устраняет любые требования к PHP-коду искать конфигурацию в определенном месте. OTOH плохо масштабируется для больших объемов данных и его трудно повсеместно изменить во время выполнения.
На клиенте
Одно место, которое я не упомянул для хранения данных конфигурации, - это клиент. Опять же, накладные расходы сети означают, что это плохо масштабируется для больших объемов конфигурации. И поскольку конечный пользователь имеет контроль над данными, они должны храниться в формате, в котором любое вмешательство может быть обнаружено (например, с помощью криптографической подписи), и не должен содержать никакой информации, которая подвергается риску в результате ее раскрытия (например, с обратимым шифрованием).
И наоборот, это дает много преимуществ для хранения конфиденциальной информации, которая принадлежит конечному пользователю - если вы не храните ее на сервере, ее невозможно украсть оттуда.
Сетевые каталоги
Еще одно интересное место для хранения информации о конфигурации - это DNS / LDAP. Это будет работать для небольшого количества небольших фрагментов информации, но вам не нужно придерживаться 1-й нормальной формы - рассмотрите, например, SPF .
Инфраструктура поддерживает кэширование, репликацию и распространение. Следовательно, он хорошо работает для очень больших инфраструктур.
Системы контроля версий
Конфигурация, как и код, должна управляться, а версия должна контролироваться - следовательно, получение конфигурации непосредственно из вашей системы VC является жизнеспособным решением. Но часто это приводит к значительным накладным расходам, поэтому рекомендуется кэширование.