Лучшие практики при использовании XML для конфигурации PHP?
Автор вопроса: KevinОтветов: 9
Я планировал использовать XML-документ для хранения конфигурации моего следующего PHP-проекта в формате, аналогичном файлам ASP.NET Web.Config. Всего две заботы:
Невозможно передать в браузер.
Должен быть жизнеспособным на виртуальном хостинге.
Лучший способ предотвратить его обслуживание - изменить тип файла на PHP и добавить следующий комментарий:
Это работает нормально, но я не чувствую, что это лучшее решение.
Кто-нибудь еще использовал XML для хранения конфигурации проекта PHP? Какие есть хорошие альтернативные решения (вместо того, чтобы помещать комментарий в начало файла, который выходит из скрипта, если константа не определена)?
Обновление:
Изменено название вопроса, чтобы лучше отражать то, что я ищу. Извините за вводящее в заблуждение название исходного вопроса. Использование XML для конфигурации не вопрос. Я прошу рекомендации по использованию XML для конфигурации. Пожалуйста, перестаньте предлагать мне использовать массивы или INI-файлы...
Я хочу, чтобы файл конфигурации был как можно проще в использовании, даже для разработчиков, не использующих php. Я выбрал XML, потому что он не зависит от языка. Я уже использую SimpleXML для анализа конфигурации (частично). Я также не беспокоюсь о компиляции или ускорении, потому что этого можно добиться с помощью memcached или других утилит.
На данный момент лучшими решениями являются:
Moving it out of web root.
Possible, but would like to keep the config as close as possible to the application.
Using htaccess to hide the config file.
I don't want to risk the chance that someone breaks the .htaccess file, leaving the config file exposed.
Я хотел бы услышать от кого-то, у кого есть опыт использования XML для параметров конфигурации в приложении, и как они предотвращают обслуживание файла конфигурации.
Почему бы не использовать parse_ini для получения конфигурации? Он анализирует ini-файл и возвращает массив. 30.03.2013
Я думаю, что лучший способ предотвратить доступ к файлам извне - хранить их вне корневой веб-папки.
Ответ 2 · рейтинг 6 · leepowers
Это то, что я обычно делаю для файлов конфигурации - на самом деле это скорее базовая настройка, обычно она обернута в пользовательский класс, который объединяет несколько файлов конфигурации в один объект конфигурации:
$config= include('config.php');
if ($config['config1'])
...
Конфигурация хранится в виде массива PHP в файле файла PHP, поэтому он анализируется механизмом PHP и никогда не возвращается в браузер. (Вы можете дополнительно защитить файлы конфигурации, сохранив их вне корневого веб-сайта, установив правило mod_rewrite для предотвращения обслуживания файлов/каталогов конфигурации и т. д.)
Хранение информации о конфигурации в XML-файле добавляет дополнительную нагрузку на синтаксический анализ XML-файла для каждого запроса. Хранение данных расширенной конфигурации в базе данных - это хорошо, но также и дорого (очевидно, база данных не будет хранить информацию о вашем подключении к базе данных, поэтому вам все равно понадобится решение для конфигурации для некоторой базовой информации). Данные конфига обычно очень статичны (записываются редко/читаются каждый запрос), так что это зрелое кеширование через memcached или другие схемы кэширования.
Ответ 3 · рейтинг 5 · cletus
Либо поместите их за пределы корня документа, либо, если вы не можете или не хотите, запретите доступ к ним извне, просто используйте Apache mod_rewrite. Например:
RewriteEngine On
RewriteRule ^config.xml [R=404,L]
PHP имеет несколько библиотек для чтения/записи XML, так что здесь нет проблем. Если это относительно простые (плоские) данные, рассмотрите возможность использования INI-файлов. PHP имеет parse_ini_file() в качестве встроенной функции, и все в .Net будет читать файлы .ini.
Ответ 4 · рейтинг 2 · Kevin
Я не искал альтернатив решению конфигурации XML, я искал альтернативы способу предотвращения обслуживания файла конфигурации. Я должен был лучше сформулировать свой вопрос.
На данный момент лучшими решениями являются перемещение файла из корневого каталога или использование htaccess. Я уже решил не делать ни того, ни другого, прежде чем опубликовать здесь, я должен был упомянуть и об этом.
Никто не сказал ничего плохого об использовании оператора exit в начале XML-файла, так что, думаю, я пока продолжу это делать.
Ответ 5 · рейтинг 1 · Tor Valamo
Если вы можете поместить его вне общей папки, это будет оптимальным решением. Кроме этого, mod_rewrite, указанный cletus, является хорошим вариантом.
Ответ 6 · рейтинг 1 · ivanjovanovic
Размышляя о конфигурации приложения, возникает вопрос, кто будет им управлять. Если он будет управляться вами как разработчиком и не ожидается, что какая-то третья сторона будет вовлечена, лучший способ - сохранить их в массивах PHP, поскольку в конце вы всегда конвертируете любой формат в какой-то объект или массив. Таким образом, вы защищены, поскольку, если вы не напечатаете его, он будет проанализирован как PHP и не будет отображаться в выводе.
PHP теперь имеет удобный SimpleXML http://php.net/manual/en/book.simplexml.php lib для управления XML-данными. Хотя я бы предпочел YAML http://www.yaml.org/ в качестве языка конфигурации, поскольку он не такой подробный, как XML, и имеет хорошие средства для составления иерархических файлов конфигурации, которые обычно необходимы, когда у вас есть несколько сред разработки, таких как dev, test, live. Также существуют различные библиотеки PHP для работы с файлами YAML.
Поскольку конфиги включаются в каждый запрос, вы можете каким-то образом кэшировать их в памяти, например, mamcache, apc или что-то подобное, чтобы не читать с диска при каждом запросе.
Что касается защиты доступа к файлу, который не анализируется интерпретатором PHP .xml или .yml, поскольку другие предлагали не помещать его в обслуживающую папку или использовать правила перезаписи.
Ответ 7 · Vladislav Rastrusny
Конфигурации XML работают медленно. Я думаю, вам нужно будет скомпилировать их в PHP. Или используйте PEAR_Config, чтобы упростить работу. Что касается предотвращения доступа из браузера ... Подойдет простая директива Apache вместе с "Заказать разрешить, запретить запретить всем". Проверьте документы апача.
Ответ 8 · gabrielk
Вы можете хранить xml-файл вне корневого каталога веб-сайта, и в этом случае доступ к нему будет невозможен без входа в файловую систему компьютера, или вы можете использовать .htaccess (или эквивалент IIS), чтобы заблокировать доступ к вашему каталогу конфигурации.
Виртуальный хостинг должен допускать оба этих сценария.
Ответ 9 · AntonioCS
Я бы предложил использовать обычные массивы для конфигураций. Есть файл с:
А затем вызовите файл, в котором определены все эти элементы $conf, добавьте пути или URL-адрес сервера или что-то еще и сохраните все эти данные в файл, используя var_export.
В конце у вас будет "скомпилированный" файл, который вы можете легко вызвать.
Примечание: var_export получает только содержимое массива, а не его имя и конец ';'