Создание двухстороннего файла конфигурации - PullRequest
6 голосов
/ 21 июня 2010

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

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

Использование файла JSON ...

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

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

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

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

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

Использование двух файлов

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


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

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

Ответы [ 5 ]

5 голосов
/ 21 июня 2010

INI

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

Так что вы, возможно, уже видели: создание 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

2 голосов
/ 21 июня 2010

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

1 голос
/ 21 июня 2010

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

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

Я бы просто пошел с XML, он самодокументируется до точки <Email>hi@hi.hi</Email>

1 голос
/ 21 июня 2010

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

1 голос
/ 21 июня 2010

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

Я бы оценил мои предпочтения:

  1. XML
  2. JSON
  3. ini (в крайнем случае)
...