Лучшие практики при использовании 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)


arrow_upward
3
arrow_downward

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

person Igor Zinov'yev    schedule 30.12.2009

arrow_upward
6
arrow_downward

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

конфиг.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

arrow_upward
5
arrow_downward

Либо поместите их за пределы корня документа, либо, если вы не можете или не хотите, запретите доступ к ним извне, просто используйте 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

arrow_upward
2
arrow_downward

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

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

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

person Kevin    schedule 03.01.2010

arrow_upward
1
arrow_downward

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

person Tor Valamo    schedule 30.12.2009

arrow_upward
1
arrow_downward

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

arrow_upward
0
arrow_downward

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

person Vladislav Rastrusny    schedule 30.12.2009

arrow_upward
0
arrow_downward

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

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

person gabrielk    schedule 30.12.2009

arrow_upward
0
arrow_downward

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

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

и т.д..

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

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

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

person AntonioCS    schedule 30.12.2009