Варіанти, які я бачу з відносними достоїнствами та недоліками:
Файлові механізми
Вони вимагають, щоб ваш код шукав певні місця, щоб знайти файл ini. Цю проблему важко вирішити, і вона завжди виникає у великих програмах PHP. Однак вам, ймовірно, доведеться вирішити проблему, щоб знайти код PHP, який включається / повторно використовується під час виконання.
Загальноприйняті підходи до цього - завжди використовувати відносні каталоги або шукати з поточного каталогу вгору, щоб знайти файл, названий виключно у базовій директорії програми.
Загальними форматами файлів, що використовуються для конфігураційних файлів, є PHP-код, відформатовані файли ini, JSON, XML, YAML та серіалізований PHP
PHP-код
Це забезпечує величезну гнучкість для представлення різних структур даних, і (за умови, що він обробляється за допомогою включення або вимагання) проаналізований код буде доступний з кешу коду операційного коду, що дає перевагу продуктивності.
Шлях включення надає кошти для абстрагування потенційних місць розташування файлу , не покладаючись на додатковому коді.
З іншого боку, однією з головних причин відокремлення конфігурації від коду є розділення відповідальності. Він надає маршрут для введення додаткового коду в середовище виконання.
Якщо конфігурація створюється за допомогою інструменту, можливо, можливо перевірити дані в інструменті, але не існує стандартної функції для виходу даних для вбудовування в PHP-код, яка існує для HTML, URL-адрес, операторів MySQL, команд оболонки ... .
Серіалізовані дані
Це відносно ефективно для невеликих обсягів конфігурації (приблизно до 200 елементів) і дозволяє використовувати будь-яку структуру даних PHP. Для створення / синтаксичного аналізу файлу даних потрібно дуже мало коду (тому ви можете замість цього витратити свої зусилля на те, щоб файл писався лише з відповідною авторизацією).
Екранування вмісту, записаного у файл, обробляється автоматично.
Оскільки ви можете серіалізувати об'єкти, це створює можливість для виклику коду, просто прочитавши файл конфігурації (магічний метод __wakeup).
Структурований файл
Зберігання його як файлу INI, як запропоновано Marcel або JSON або XML, також забезпечує простий API для відображення файлу в структурі даних PHP (і, за винятком XML, для уникнення даних та створення файлу), усуваючи при цьому виклик коду вразливість із використанням серіалізованих даних PHP.
Він буде мати характеристики, подібні до серіалізованих даних.
Зберігання бази даних
Це найкраще враховувати там, де у вас є величезна кількість конфігурації, але вибіркові у тому, що потрібно для поточного завдання - я був здивований, коли приблизно в 150 елементах даних було швидше отримати дані з локального екземпляра MySQL, ніж десеріалізувати файл даних.
OTOH - це не найкраще місце для зберігання облікових даних, які ви використовуєте для підключення до бази даних!
Середовище виконання
Ви можете встановити значення у середовищі виконання, в якому працює PHP.
Це усуває будь-які вимоги щодо пошуку коду PHP у певному місці для конфігурації. OTOH він погано масштабується до великих обсягів даних і його важко змінити універсально під час виконання.
На клієнта
Одне місце, про яке я не згадував для зберігання даних конфігурації, знаходиться у клієнта. Знову ж накладні витрати на мережу означають, що це не дуже добре масштабується до великої кількості конфігурації. І оскільки кінцевий користувач має контроль над даними, він повинен зберігатися у форматі, де будь-яке втручання можна виявити (тобто за допомогою криптографічного підпису), і не повинно містити жодної інформації, яка загрожує його розкриттям (тобто оборотно зашифрована).
І навпаки, це має багато переваг для зберігання конфіденційної інформації, якою володіє кінцевий користувач - якщо ви не зберігаєте її на сервері, її неможливо вкрасти звідти.
Мережеві каталоги
Ще одне цікаве місце для зберігання інформації про конфігурацію - це DNS / LDAP. Це буде працювати для невеликої кількості невеликих частин інформації - але вам не потрібно дотримуватися 1-ї звичайної форми - розгляньте, наприклад, SPF .
Інфраструктура підтримує кешування, реплікацію та розподіл. Отже, він добре працює для дуже великих інфраструктур.
Системи контролю версій
Конфігурацією, як і кодом, слід керувати та контролювати версію - отже, отримання конфігурації безпосередньо з вашої системи VC є життєздатним рішенням. Але часто це пов'язано зі значними накладними витратами, тому кешування може бути доцільним.