Создание “двух путей” конфигурационный файл

Я пишу приложение PHP, предназначенное для нефанатов, непрограммистов. Я должен создать страницу опции с набором "опций" и затем сохранить те опции... где-нибудь. Используя приложение базы данных (MySQL/PostgreSQL/SQLite) вне рассмотрения, потому что будет требоваться больше конфигурации, чем пользовательские потребности сделать (я не хочу, чтобы пользователь сделал любой вид конфигурации, если он не хочет к). Таким образом, единственное оставленное решение состоит в том, чтобы записать конфигурацию в конфигурационный файл. С другой стороны, я также хочу, чтобы тот конфигурационный файл был человекочитаем в случае, если пользователь является фанатом, и он хочет отредактировать файл конфигурации непосредственно (или если он хочет отредактировать файл удаленно через SSH или какой-либо вид причины...),

Вот эти несколько потенциальных решений, которые я нашел:

Используя файл JSON...

... Получите данные из файла, с помощью json_decode, чтобы преобразовать данные, произвести его в HTML, получить любые изменения, закодировать назад использование json_encode, и т.д. Вы получаете изображение. Существует пара вещей, что мне не нравится приблизительно этот метод, при этом основной - то, что закодированные данные JSON с помощью PHP будут не быть хорошо отформатированными и очень трудно отредактировать, не будучи переформатированным заранее.

Использование XML-файла

Я не опишу то решение, потому что мне действительно не нравится оно ни один..., и я не знаю, как использовать XSLT, и действительно не хотят учиться... и потому что это - симпатичное тяжелое решение, по крайней мере, по сравнению с решением JSON. Исправьте меня, если я неправ.

Используя файл INI

Я люблю файлы INI, действительно я люблю их! Я думаю, что они являются действительно самыми читаемыми, и трудно испортить (т.е.: синтаксические ошибки). Проблема с тем решением состоит в том, что нет никакого собственного способа писать/редактировать ini файл. Я нашел тему, показывающую пользовательский метод записать тот..., который мог бы быть решением, которое я приму, если я ничего не найду лучше...

Используя два файла

То последнее решение кажется столь же разумным как решение INI. На самом деле я мог использовать файл INI, как "введено" (файл, который отредактирует пользователь, если он захочет к), и файл XML/JSON, как произведено (файл, который будет отредактирован PHP каждый раз пользовательские опции изменений с помощью веб-фронтенда). На данном этапе лучшее решение состояло бы в том, чтобы попросить, чтобы пользователь перезагрузил конфигурацию вручную, если бы он отредактировал файл конфигурации непосредственно, так, чтобы "выходной" файл был всегда актуален.


Я знаю, что ни одно из решений выше не прекрасно, и вот почему я создал эту тему для просьбы совет. Каково лучшее решение? Возможно (вероятно), я пропустил еще одно решение.

Одна последняя вещь: YAML не является допустимым решением, потому что намного легче испортить синтаксис, если Вы не привыкли к нему. PHP не является решением также, потому что редактирование PHP с PHP является болью. PHP является только хорошим решением, если я хочу получить некоторую конфигурацию, но не отредактировать ее непосредственно через веб-фронтенд.

6
задан Robert Audi 21 June 2010 в 03:55
поделиться

5 ответов

ini

Я бы сам написал ini файлы. Как вы сказали, синтаксис очень прост, и это то, что вам нужно в конфигурационном файле. Сочетание "ключ+значение" в формате ini - это именно то, что вы получите с базой данных, но без базы данных.

Похожие SO вы, возможно, уже видели: создание ini файла, запись значений в PHP

Плюс вы можете использовать parse_ini_file() для его чтения.

XML

XML не так уж и плох. Возможно, его написание требует больше усилий (и может быть не таким понятным для пользователя, как ini-файл), но читать его очень просто.

Создать его:


<?php
// Create file
$xml = new SimpleXMLElement( '<?xml version="1.0" ?><config></config>' );

// Add stuff to it
$xml->addChild( 'option1' );
$xml->option1->addAttribute( 'first_name', 'billy' );
$xml->option1->addAttribute( 'middle_name', 'bob' );
$xml->option1->addAttribute( 'last_name', 'thornton' );
$xml->addChild( 'option2' );
$xml->option2->addAttribute( 'fav_dessert', 'cookies' );

// Save
$xml->asXML( 'config.xml' );
?>

Прочитать его:


<?php
// Load
$config = new SimpleXMLElement( file_get_contents( 'config.xml' ) );

// Grab parts of option1
foreach( $config->option1->attributes() as $var )
{
    echo $var.' ';
}

// Grab option2
echo 'likes '.$config->option2['fav_dessert'];
?>

Что дает вам:

billy bob thornton likes cookies

Документация по SimpleXML

5
ответ дан 10 December 2019 в 00:32
поделиться

Я бы выбрал ini . Их действительно не так уж сложно написать. Я лично ненавижу XML. Он такой раздутый ... даже если размер файла не имеет значения, он все равно заставляет меня съеживаться от его многословности и объема набора текста, который мне нужно сделать. Плюс люди тупые. Они не закрывают свои теги.

2
ответ дан 10 December 2019 в 00:32
поделиться

Стандартным способом являются XML-файлы. Они создают не так много накладных расходов и легко расширяются. Однако файлы JSON наиболее просты с точки зрения программирования.

Я бы расположил свои предпочтения так:

  1. XML
  2. JSON
  3. ini (последнее средство)
1
ответ дан 10 December 2019 в 00:32
поделиться

Если у вас нет 1000+ опций, вам не стоит беспокоиться о размере XML-файла. Цель здесь состоит в том, чтобы все было просто для пользователя. Это означает, что какой бы метод вы ни выбрали (JSON, на мой взгляд, не должен быть одним из них), он должен быть подробно документирован в каждой строке конфигурации.

Ваше решение с двумя файлами возвращает меня во времена конфигурации sendmail и заставляет содрогнуться.

Я бы просто перешел на XML, он самодокументирующийся до определенного момента hi@hi.hi

1
ответ дан 10 December 2019 в 00:32
поделиться

Ну, вы можете использовать serialize() от PHP, и хотя она читаема для человека, это не самая читаемая вещь из всех существующих. По реализации он находится на том же уровне, что и JSON.

1
ответ дан 10 December 2019 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: