Лучшие практики при использовании XML для конфигурации PHP?

Я планировал использовать XML-документ для хранения конфигурации моего следующего PHP-проекта в формате, аналогичном файлам ASP.NET Web.Config. Всего две заботы:

  1. Невозможно передать в браузер.
  2. Должен быть жизнеспособным на виртуальном хостинге.

Лучший способ предотвратить его обслуживание — изменить тип файла на PHP и добавить следующий комментарий:

<?xml version="1.0" ?>
<!-- <?php if(!defined('FW_LOADED')){ exit; } ?> -->
<configuration>
....
</configuration>

Это работает нормально, но я не чувствую, что это лучшее решение.

Кто-нибудь еще использовал 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 для параметров конфигурации в приложении, и как они предотвращают обслуживание файла конфигурации.


person Kevin    schedule 30.12.2009    source источник
comment
Почему бы не использовать parse_ini для получения конфигурации? Он анализирует ini-файл и возвращает массив.   -  person    schedule 30.03.2013


Ответы (9)


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

person Igor Zinov'yev    schedule 30.12.2009

Это то, что я обычно делаю для файлов конфигурации — на самом деле это скорее базовая настройка, обычно она обернута в пользовательский класс, который объединяет несколько файлов конфигурации в один объект конфигурации:

конфиг.php:

return array(
 'config1'=> 'config1value',
 'config2'=> 'config2value',
);

некоторая_страница.php:

$config= include('config.php');
if ($config['config1'])
 ...

Конфигурация хранится в виде массива PHP в файле файла PHP, поэтому он анализируется механизмом PHP и никогда не возвращается в браузер. (Вы можете дополнительно защитить файлы конфигурации, сохранив их вне корневого веб-сайта, установив правило mod_rewrite для предотвращения обслуживания файлов/каталогов конфигурации и т. д.)

Хранение информации о конфигурации в XML-файле добавляет дополнительную нагрузку на синтаксический анализ XML-файла для каждого запроса. Хранение данных расширенной конфигурации в базе данных — это хорошо, но также и дорого (очевидно, база данных не будет хранить информацию о вашем подключении к базе данных, поэтому вам все равно понадобится решение для конфигурации для некоторой базовой информации). Данные конфига обычно очень статичны (записываются редко/читаются каждый запрос), так что это зрелое кеширование через memcached или другие схемы кэширования.

person leepowers    schedule 30.12.2009

Либо поместите их за пределы корня документа, либо, если вы не можете или не хотите, запретите доступ к ним извне, просто используйте Apache mod_rewrite. Например:

RewriteEngine On
RewriteRule ^config.xml [R=404,L]

PHP имеет несколько библиотек для чтения/записи XML, так что здесь нет проблем. Если это относительно простые (плоские) данные, рассмотрите возможность использования INI-файлов. PHP имеет parse_ini_file() в качестве встроенной функции, и все в .Net будет читать файлы .ini.

person cletus    schedule 30.12.2009

Я не искал альтернатив решению конфигурации XML, я искал альтернативы способу предотвращения обслуживания файла конфигурации. Я должен был лучше сформулировать свой вопрос.

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

Никто не сказал ничего плохого об использовании оператора exit в начале XML-файла, так что, думаю, я пока продолжу это делать.

person Kevin    schedule 03.01.2010

Если вы можете поместить его вне общей папки, это будет оптимальным решением. Кроме этого, mod_rewrite, указанный cletus, является хорошим вариантом.

person Tor Valamo    schedule 30.12.2009

Размышляя о конфигурации приложения, возникает вопрос, кто будет им управлять. Если он будет управляться вами как разработчиком и не ожидается, что какая-то третья сторона будет вовлечена, лучший способ - сохранить их в массивах 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, поскольку другие предлагали не помещать его в обслуживающую папку или использовать правила перезаписи.

person ivanjovanovic    schedule 30.12.2009

Конфигурации XML работают медленно. Я думаю, вам нужно будет скомпилировать их в PHP. Или используйте PEAR_Config, чтобы упростить работу. Что касается предотвращения доступа из браузера ... Подойдет простая директива Apache вместе с «Заказать разрешить, запретить запретить всем». Проверьте документы апача.

person Vladislav Rastrusny    schedule 30.12.2009

Вы можете хранить xml-файл вне корневого каталога веб-сайта, и в этом случае доступ к нему будет невозможен без входа в файловую систему компьютера, или вы можете использовать .htaccess (или эквивалент IIS), чтобы заблокировать доступ к вашему каталогу конфигурации.

Виртуальный хостинг должен допускать оба этих сценария.

person gabrielk    schedule 30.12.2009

Я бы предложил использовать обычные массивы для конфигураций. Есть файл с:

$conf['item1'] = 'value';
$conf['item2'] = 'value2';

и т.д..

А затем вызовите файл, в котором определены все эти элементы $conf, добавьте пути или URL-адрес сервера или что-то еще и сохраните все эти данные в файл, используя var_export.

В конце у вас будет «скомпилированный» файл, который вы можете легко вызвать.

Примечание: var_export получает только содержимое массива, а не его имя и конец ';'

person AntonioCS    schedule 30.12.2009