2010-10-08 1 views
7

Примечание: Конфигурация хранится в файле PHP, config.php.Каков наилучший способ (кодирование) для хранения конфигурации системы в приложении PHP?

Я видел это сделать по-другому, вот краткий список примеров (я хранить данные в БД этих примерах):

Константы: глобальный, только для чтения

define('DB_USER','user12'); 
define('DB_PASS','21user'); 

Использование GLOBALS массива: глобальный, изменчиво, повторяющиеся, смешанные с другими глобал

$GLOBALS['DB_USER']='user12'; 
$GLOBALS['DB_PASS']='21user'; 

Используя неглобальный массив, но подняли globaly: возможно, хуже, чем 2-й варианта

$config=array(); ... 

$config['DB_USER']='user12'; 
$config['DB_PASS']='21user'; 

... global $config; 
    mysql_connect('localhost',$config['DB_USER'],$config['DB_PASS']); 

Определение свойств класса: (глобальный, перечислимы)

class Config { 
    public $DB_USER='user12'; 
    public $DB_PASS='21user'; 
} 

Критерии/Опции/Особенности:

  • простота кодирования: вы не хотели бы, чтобы проверить, настройка существует или инициализируется
  • легкость модификации: не-программист/неспециалист может легко изменить настройки
  • хранить в чистом месте: не смешивается с другими переменными (может быть сохранены в подрешетке)
  • модификации выполнения: в некоторых случаях, другие разработчики могут легко изменить существующие настройки

Возможно, потребуется изменить конфигурацию в течение некоторого времени во время работы системы, поэтому вариант 1 уже не является жизнеспособным. Третий вариант тоже не слишком чист.

При написании этого сообщения я получаю большое предупреждение о том, что обсуждение является субъективным и закрытым. Итак, , пожалуйста, не отставайте от темы и дайте обоснованные причины своим ответам.


Это довольно очевидный вопрос, и учитывая, что я хорошо знаком с различными ответами, вы можете спросить, почему я делаю всю эту суету? Дело в том, что я разрабатываю фреймворк и, в отличие от другой структуры (* ahem * joomla * ahem *), я не хочу проходить через их ошибку, бросая в ошибочное решение, которое в конечном итоге должно быть изменено/повторно назначается в будущем.


Edit: Прежде, расположение конфигурационного файла меня не касается. Я буду уверен, что люди могут легко изменить местоположение, если захотят, но это не будет требование. Первый, дешевые веб-хосты не позволяют это делать, во-вторых, насколько безопасность идет, это действительно не очень хороший вариант. Зачем? Потому что структура должна знать, где находится конфиг. Действительно, безопасность через неясность не работает.Я бы предпочел исправить все RFI и XSS (например), чем быть параноидальными, скрывая файл конфигурации под несколькими слоями.

+1

Возможный дубликат [Что является лучшим способом хранения переменных конфигурации в PHP?] (Http: // stackoverflow .com/questions/593440/what-is-the-best-way-to-store-configuration-variables-in-php) – alex

+0

'Возможно, потребуется изменить конфигурацию некоторое время во время работы системы, поэтому опция 1 уже не жизнеспособна' - звучит не очень хорошая система! Вся идея файла конфигурации заключается в том, что вы определяете ** константы ** с общими настройками сайта, такими как настройки базы данных, возможно, названия страниц и т. Д. Какие вещи вы храните, что вы можете изменить? – chigley

+0

Вот как это работает: класс PHP, база данных, работает с константами конфигурации DB_ ?, кто-то может захотеть написать скрипт для синхронизации двух БД (в качестве примера), но не может использовать класс базы данных, потому что он не может измените константы .... ОК, это довольно хромой пример, я не могу придумать лучшего. Надеюсь, ты получишь идею. – Christian

ответ

2

Почему бы не использовать Zend_Config? Он создает общий интерфейс для параметров конфигурации, которые могут быть сохранены в confing-файле или базе данных (с соответствующим адаптером). И это легкий вес; вам не нужно вводить всю инфраструктуру Zend, чтобы использовать ее.

Кстати, поскольку вы строите фреймворк, вы должны свести загрязнение глобального пространства имен к минимуму. Что-то вроде вашего 3-го варианта, и если вы ориентируетесь только на 5.3, посмотрите на использование правильных пространств имен.

+0

Я не буду использовать чью-либо фреймворк. Кроме того, если у них есть собственная система конфигурации, которая достаточно хороша, я, вероятно, смогу ее повторить в моем коде. – Christian

+0

+1 к вашему второму абзацу, в то время как на нем я хотел бы упомянуть, что я не нацелен на 5.3+ – Christian

+0

Нашел эту очень полезную статью: http://devzone.zend.com/article/1264 – Christian

0

Включите общий файл и включите его там, где вам нужно. Преимущество, когда вы переходите в прямом эфире или переходите на свой тестовый сервер, вам просто нужно отредактировать только этот файл, и все конфиги будут изменены. Метод 2 лучше, так как он позволяет вам изменить его.

Запомни раз при подключении к MySQL, если вам нужно изменить пользователя и передать вам придется повторно подключить

+0

Извините, я не упомянул, что уже использую параметр, содержащий только один файл ... будет обновлять тему. – Christian

4

Жестко кодированные данные могут быть недоступны, если люди, выполняющие реконфигурацию, не являются кодовыми. Рассмотрим использование parse_ini_file().

+0

Часть о пользователи, не являющиеся кодовым-адептом, являются ДЕЙСТВИТЕЛЬНО хорошим аргументом.Однако я боюсь использовать ini-файлы, так как они загружаемы, и, конечно же, вы не захотите, чтобы люди загружали файл конфигурации, содержащий данные FTP вашего сервера. :-) – Christian

+0

Не используйте расширение .ini. Вместо этого используйте что-то другое. Или сохраните файл по пути, не доступному в Интернете. – stillstanding

+0

Если я не скрою файл через htaccess (многие способы сделать это, но это выглядит как взломать меня), единственным жизнеспособным вариантом является расширение PHP с '[]' в начале файла, чтобы остановить анализатор, пока все еще имея действительный ini-файл - хотя опять-таки это звучит как плохой дизайн/взлома. – Christian

1

Немного поздно, но это может быть интересно для вас: http://milki.include-once.org/genericplugins/genconfig.html

Это обеспечивает простой API для редактирования PHP файлы конфигурации на месте. Он хранит комментарии и другой код в тактике. И он позволяет использовать глобальный $ config array/ArrayObject и определять константы. Он работает почти автоматически в сочетании с комментариями конфигурации плагина. Однако, это много кода. Но, возможно, стоит проверить концепцию. (Я также использую readable config.php, так как это кажется самым полезным форматом конфигурации для меня.)