Как лучше всего (с точки зрения программирования) сохранить конфигурацию системы в приложении PHP?

Примечание. Конфигурация хранится в файле PHP config.php.

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

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

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

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

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

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

$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 уже неприменим. Третий вариант тоже не слишком чистый.


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


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


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


person Christian    schedule 08.10.2010    source источник
comment
возможный дубликат Как лучше всего хранить переменные конфигурации в PHP?   -  person alex    schedule 08.10.2010
comment
The configuration might need to be changed some time during the running of the system, so option 1 is already not viable - звучит не очень хорошо! Вся идея файла конфигурации заключается в том, что вы определяете константы с общими настройками сайта, такими как настройки базы данных, возможно, заголовки страниц и т. Д. Какие вещи вы храните, которые вы могли бы захотеть изменить?   -  person chigley    schedule 08.10.2010
comment
Вот как это работает: класс PHP, База данных, работает с константами конфигурации DB_ ?, кто-то может захотеть написать сценарий для синхронизации двух БД (в качестве примера), но не может использовать класс базы данных, потому что он не может изменить константы .... хорошо, это довольно неубедительный пример, я не могу придумать лучшего. Надеюсь, вы уловили идею.   -  person Christian    schedule 08.10.2010
comment
Алекс, теперь, когда я это вижу, я согласен, однако ответ на это не то, что я ищу. Предложения?   -  person Christian    schedule 08.10.2010
comment
возможный дубликат PHP, чтение файла   -  person Gordon    schedule 08.10.2010
comment
Гордон - Действительно, это смешно. Не возражаете ли вы на самом деле внести свой вклад в обсуждение?   -  person Christian    schedule 08.10.2010
comment
@Christian, я не думаю, что вы знаете, что такое безопасность через безвестность. Сделать ваши файлы конфигурации общедоступными и надеяться, что люди не наткнутся на них, это и есть безопасность через неизвестность.   -  person meagar    schedule 08.10.2010
comment
meagar - я прекрасно знаю, что это значит. Я начинаю думать, что есть явное недоразумение, поскольку все это время я говорил, что фреймворк, который может раскрывать путь к конфигурации, всегда делает ее небезопасной, независимо от того, находится ли конфигурация в корневом каталоге документации или нет.   -  person Christian    schedule 08.10.2010


Ответы (4)


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

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

person MadCoder    schedule 08.10.2010
comment
Я не буду использовать чужой фреймворк. Кроме того, если у них есть собственная система конфигурации, которая достаточно хороша, я, вероятно, смогу воспроизвести ее в своем коде. - person Christian; 08.10.2010
comment
+1 ко второму абзацу, но я хотел бы упомянуть, что я не нацелен на 5.3+ - person Christian; 08.10.2010

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

person bcosca    schedule 08.10.2010
comment
То, что пользователи не разбираются в коде, - ДЕЙСТВИТЕЛЬНО хороший аргумент. Однако я боюсь использовать ini-файлы, поскольку они загружаются, и, конечно же, вы бы не хотели, чтобы люди загружали файл конфигурации, который содержит данные FTP вашего сервера. :-) - person Christian; 08.10.2010
comment
Не используйте расширение файла .ini. Вместо этого используйте что-нибудь другое. Или сохраните файл по пути, не доступному через Интернет. - person bcosca; 08.10.2010
comment
Если я не скрою файл через htaccess (много способов сделать это, но для меня это похоже на взлом), единственный жизнеспособный вариант - это расширение PHP с [<?php die; ?>] в начале файла, чтобы остановить синтаксический анализатор при сохранении действительного ini файл - хотя, опять же, это звучит как плохой дизайн / взлом. - person Christian; 08.10.2010
comment
Почему бы не сохранить основной файл конфигурации вне открытого дерева htdocs? Затем используйте заглушку config.php или ini, указывающую на правильную конфигурацию. - person MadCoder; 08.10.2010
comment
Кроме того, Христиан прав; использование htaccess для сокрытия конфиденциальных данных - плохая идея. Я видел, что это не удалось; Apache с радостью обработает файлы php и ini как необработанный текст. - person MadCoder; 08.10.2010
comment
MadCoder, вы бы использовали CMS / фреймворк, если бы одним из внутренних требований было то, что вы предлагаете (файл вне корневого каталога)? Я знаю, что не стал бы, это должно быть очень дрянная структура, если к ней предъявляются такие глупые требования. - person Christian; 08.10.2010
comment
Конфиденциальные данные безопасности никогда не должны храниться где-либо в пределах docroot, и точка. Я бы определенно не стал использовать фреймворк, который заставлял бы меня работать против него, чтобы следовать самым основным принципам безопасности. Серьезное отношение к безопасности было бы отличным способом выделиться из огромного моря фреймворков PHP. - person MadCoder; 08.10.2010
comment
@ christian-sciberras Дрянный фреймворк - это такой фреймворк, который не заботится о безопасности и заставляет вас хранить все в корне Интернета. - person bcosca; 08.10.2010
comment
MadCoder - мы оба согласны с тем, что безопасность является приоритетом, однако я не вижу необходимости параноидально относиться к этому. Хранение конфиденциальной информации в docroot или нет не очень важно, поскольку, если у кого-то есть доступ к скрипту, он может с таким же успехом включать (читать и т. Д.) Файлы из docroot, нарушая первоначальную цель. Я считаю этот вариант дрянным, поскольку есть альтернативы получше, которые позволяют хранить конфиденциальную информацию в docroot. Дело в том, что фреймворк должен учитывать, что он может работать где угодно с любой конфигурацией (в отношении htaccess и т. Д.). - person Christian; 08.10.2010
comment
все еще существует - как я сказал MadCoder, обеспечение безопасности не означает ограничение функций или ограничение использования. Если кто-то хочет запустить веб-сайт с этим фреймворком, от него не требуется извлекать все из корневого каталога. - person Christian; 08.10.2010
comment
Я считаю, что это обсуждение, связанное с безопасностью, в основном спорно. Я удостоверяюсь, что фреймворк (и все следующие разработчики) соблюдают правила безопасности, однако паранойя по этому поводу никому не помогает. Если люди так сильно боятся docroot, с тем же успехом они могут запускать простые статические html-файлы, потому что, честно говоря, независимо от того, как построен фреймворк, всегда есть один и тот же уровень риска. Если docroot - это дыра, перемещение всего в другое место не поможет. - person Christian; 08.10.2010
comment
Вернемся к тому, что я называю дрянной структурой. Помните, как мы настраивали Apache? Все ли мы согласны с тем, что установка apache - это не легкий вопрос? Сравните его настройку вручную VS с помощью панелей управления (например, EasyApache и т. Д.). Упрощение установки не должно ставить под угрозу безопасность - просто нужно больше обдумывать и планировать. - person Christian; 08.10.2010
comment
Если вы разрабатываете правильный фреймворк, вам не следует использовать define или эти global ключевые слова, потому что они гадят по всему глобальному пространству имен. Хранение настраиваемых пользователем данных в классах - тоже не лучшая идея. Так что у вас не осталось слишком много вариантов. - person bcosca; 08.10.2010
comment
все еще стоит - ... вот почему я спрашиваю об этом здесь? Ага, дай ему передохнуть, ладно? Wordpress использует DEFINES, в то время как Joomla использовала; ОПРЕДЕЛЕНИЕ, ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ и теперь КЛАСС. - person Christian; 08.10.2010
comment
@Christian Я никогда не видел PHP-фреймворка, который ДЕЙСТВИТЕЛЬНО позволяет хранить ваши файлы конфигурации в корневом каталоге документов. Я бы категорически избегал любых фреймворков, которые действительно позволяли вам это делать, это ужасная, ужасная идея. Хранение файлов конфигурации в docroot - ужасная ошибка. Вы можете спорить с этим, но я должен задаться вопросом, почему вы вообще задали этот вопрос, если вы собираетесь не соглашаться с отзывами экспертов, которые вы получаете. - person meagar; 08.10.2010
comment
wordpress, joomla или drupal в качестве тестов для написания лучшего фреймворка не продвинутся вам достаточно далеко. ваша структура будет просто лучше, чем они, но не более надежными, где безопасность считается превыше всего :) - person bcosca; 08.10.2010
comment
meagar - Это говорит о том, что вы вообще не используете фреймворки ?! Я только что упомянул две из самых популярных CMS, которые, возможно, также являются фреймворками, которые действительно помещают конфигурацию в свой docroot. - person Christian; 08.10.2010
comment
все еще стоящий - Как я уже сказал, то, что предлагаете вы и другие, абсолютно недопустимо. Если кто-то хочет использовать небезопасный сервер, я ничего не могу сделать, чтобы предотвратить вторжение, будь то получение корневого доступа или нет. С другой стороны, позволяя людям хранить конфигурацию где угодно, в том числе НЕ В docroot, меня это устраивает. - person Christian; 08.10.2010
comment
meagar - Это абсолютно НЕ экспертный отзыв. Во-первых, Я НЕ СПРОСИЛ, ГДЕ сохранить эти конфиги, во-вторых, я не вижу причины безжалостного крика о НЕ-ПРОБЛЕМЕ. Как я уже сказал, если я загружаю конфигурацию ВНЕ ДОКРЕТА, вторжение (например, сервер, выдающий ТЕКСТОВЫЕ ФАЙЛЫ) НЕ МОЖЕТ БЫТЬ ОСТАНОВЛЕН. Это ОСНОВНОЙ ВОПРОС, а НЕ ВАРИАНТ. Если кто-то хочет обезопасить себя от раскрытия файла конфигурации, ОНИ ДОЛЖНЫ ВОЗДЕРЖАТЬСЯ ОТ ИСПОЛЬЗОВАНИЯ ЛЮБЫХ ВИДОВ РАМКИ. Теперь, если Эксперт не возражает, мне нужна помощь Эксперта, чтобы ответить на мой проклятый вопрос. - person Christian; 08.10.2010
comment
@Christian CMS и Frameworks - это очень разные вещи. Вы сбиваете с толку, называя их одним и тем же. Что вы пытаетесь создать - CMS или фреймворк? Может быть, вытрите пену с губ и немного остудите, прежде чем лопнет вену. Кроме того, подсказка: @meagar для ответа и звездочки для выделения, а не заглавных букв. - person meagar; 08.10.2010
comment
Я намеренно воздержался от обозначения этого как субъективного обсуждения, учитывая тот факт, что лучшего решения нигде не видно и что приведенные аргументы и другие представленные решения приемлемы для кверента. Я предлагаю, по крайней мере, переместить это в вики сообщества или, в худшем случае, закрыть. - person bcosca; 08.10.2010
comment
@meagar - CMS должна быть готовым фреймворком! О, и не волнуйтесь, у меня было достаточно проблем с другими экспертами по stackoverflow, чтобы сделать разрыв вен легким препятствием. - person Christian; 08.10.2010
comment
@stillstanding - Как лучшее решение когда-либо появится, если люди даже не обсуждают исходный вопрос? Я бы не прочь увидеть это закрытое после, когда мы подойдем к заключению - Stackoverflow нужен, чтобы помочь прийти к заключению, а не рассыпать вопросы, которые люди не знают, как обсуждать. Достаточно взглянуть на огромное количество ответов от 4 человек о несущественной проблеме. И снова и снова одни и те же люди заражают другие части дискуссии той же несвязанной темой. - person Christian; 08.10.2010

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

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

person mario    schedule 01.11.2010

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

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

person aWebDeveloper    schedule 08.10.2010
comment
Извините, не упомянул, что я уже использую опцию "один файл-везде" ... обновлю тему. - person Christian; 08.10.2010