Сохранение настроек для последующего редактирования в PHP

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

На данном этапе разработки настройки хранятся в файле PHP, например:

define ('UPLOAD_DIR','uploads/');
define ('DISPLAY_NUM',true);
$names = array('a' => 'b','c'=>'d','e'=>'f');

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

Каковы преимущества и недостатки использования следующих форматов? (И любые другие, которые я пропустил):

  • Пользовательский XML
  • INI (можно использовать parse_ini_file)

(Использование базы данных не подходит из-за требований к проекту. Я понимаю, что во многих ситуациях база данных предпочтительнее, но не в этом случае.)

Если бы вы не могли использовать базу данных и вам нужно было бы хранить настройки, которые можно было бы редактировать с помощью веб-интерфейса, что бы вы сделали?

(Примечание: это вопрос, отличный от этот, настройки которого изменить нельзя, это PHP-файл полностью. И да, программа установки в настоящее время записывает PHP-файл с правильными настройками.)


person Alya    schedule 11.05.2009    source источник
comment
Что вы подразумеваете под анализом массивов? Разве вы не можете просто загрузить их прямо в свое приложение? Или вы имеете в виду, что их создание в первую очередь не кажется большим удовольствием (для меня это имело бы больше смысла)?   -  person Steven Oxley    schedule 11.05.2009
comment
Я могу загрузить их напрямую (через include()), однако тогда мне придется отслеживать, какие опции были использованы, а какие были отредактированы. Я бы предпочел загрузить файл прямо в форму. Это яснее?   -  person Alya    schedule 11.05.2009


Ответы (7)


Если вы не намерены использовать XML, вы можете использовать YAML. Я использовал его только с Ruby, но быстро Google предлагает несколько вариантов поддержки PHP. TBF, ссылки там содержат некоторые аргументы против используя YAML с PHP, но YMMV.

person Dave McLaughlin    schedule 11.05.2009
comment
code.google.com/p/spyc — это загрузчик YAML, который использует платформа Symfony. Кроме того, я думаю, что Symfony — веский аргумент в пользу использования YAML с PHP. - person Steven Oxley; 11.05.2009

Хорошо, я не получил ответа, который искал. Вот такого я и ожидал.

INI

  • Хранение настроек в INI-файле может подойти для простых настроек, которые вы хотите, чтобы пользователь редактировал вручную.
  • Однако создавать сложные массивы непросто, и для понимания того, какой заголовок находится на каком уровне массива, потребуется некоторая умственная акробатика.
  • Зарезервированные слова, которые не должны использоваться нигде в файле, включают: yes, no, true и false, это может вызвать проблемы.
  • В файле можно использовать константы.
  • Нет встроенного метода записи файлов INI.

XML

  • Может использовать расширение SimpleXML, которое «предоставляет очень простой и удобный набор инструментов» для преобразования XML в объект, который затем можно обрабатывать с использованием обычных методов.
  • Позволяет использовать очень сложные массивы.
  • При необходимости можно отредактировать вручную.
  • Можно использовать внешние инструменты для проверки подлинности файла.
  • Многие процессоры XML доступны для PHP.

YAML

Помните: нет базы данных. Требуется возможность использовать сложные массивы.

person Community    schedule 19.05.2009

Мне бы не хотелось, чтобы кто-то имел прямой доступ к настройкам, поэтому важно предоставить интерфейс, который будет действовать как буфер, предотвращая преднамеренные атаки и обеспечивая чистый вывод.

Имея это в виду, выбор формата на стороне сервера вообще не важен, если вы можете правильно с ним взаимодействовать, все другие проблемы можно обойти.

person scragar    schedule 11.05.2009
comment
Итак, какой формат облегчил бы предоставление такого интерфейса? Я не хотел, чтобы они могли загрузить файл в текстовом редакторе и сделать это. Я отредактирую и внесу ясность. - person Alya; 11.05.2009

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

Краткий пример:

<myconfig>
  <define>
    <name>UPLOAD_DIR</name>
    <value>uploads/</value>
  </define>
  <define>
    <name>DISPLAY_NUM</name>
    <value>true</value>
  </define>
  <array id="names">
    <value index="a">b</value>
    <value index="c">d</value>
    <value index="e">f</value>
  </array>
</myconfig>
person gacrux    schedule 11.05.2009

PHP имеет встроенные функции для редактирования и разбора INI-файлов, которые используют обычный текстовый формат для хранения настроек программы.

person Jeff Ober    schedule 11.05.2009
comment
ОП упоминает, что он знает об этих функциях, но хочет знать. Каковы преимущества и недостатки использования следующих форматов? - person nickf; 11.05.2009
comment
Я не знаю о каких-либо собственных возможностях редактирования PHP для файлов ini. - person duckyflip; 19.05.2009

Я использовал двухэтапный подход. Переменные и их имена хранятся в базе данных с интерфейсом, который дает пользователю возможность изменять их. Когда они изменяют их, файл сохраняется на сервере, а затем используется во всем приложении (изменения также сохраняются обратно в БД). Облегчает обновление и упрощает резервное копирование — не нужно создавать резервные копии файлов, достаточно создать резервную копию базы данных. Полученные файлы представляют собой просто файлы .inc в формате $variableName = 'variablevalue';

person Jason    schedule 11.05.2009
comment
Да, за исключением исходного сообщения: (Использование базы данных ‹em›не подходит‹/em› из-за требований к проекту. Я понимаю, что во многих ситуациях база данных была бы предпочтительнее, но не в этом случае.) - person Alya; 12.05.2009

А почему не обычный php?

настроить-form.php

форма method=POST action='configure.php',

поля ввода напр. name='upload' value='<?php echo UPLOAD; ?>'

файл configure.php:

$myfile = 'sets.php';
$fh = fopen( $myfile, 'w' );
$upload = '"/upload/"';
$txt = "define( UPLOAD, '" . $_POST['upload'] . "' );";
fwrite( $fh, $txt );
fclose( $fh );

и у вас есть это. Простой php, который создает для вас файл конфигурации.

person Community    schedule 01.04.2010