Каков наилучший способ сохранить настройки приложений PHP? - PullRequest
6 голосов
/ 09 февраля 2009

У меня есть небольшое приложение, которое я разрабатываю, и которое я хочу отдать / продать другим. Я хочу сохранить некоторые настройки и создать интерфейс администратора для их изменения. Как лучше всего хранить их подальше? Таблица БД кажется излишней для 10-20 настроек, которые у меня будут, и я хочу, чтобы поиск этих настроек был как можно быстрее. Является ли плоский файл еще одним приемлемым вариантом? Какие подводные камни связаны с использованием плоского файла? Какой самый быстрый / простой способ взаимодействия с плоским файлом, в котором хранятся несколько ключей и значений?

Ответы [ 6 ]

15 голосов
/ 09 февраля 2009

Я часто использую PHP parse_ini_file для этого.

Так что, если вы напишите файл .ini с этим:

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

И прочтите это с помощью этого кода PHP:

define('BIRD', 'Dodo bird');
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

Вы получите этот вывод:

Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

    [third_section] => Array
        (
            [phpversion] => Array
                (
                    [0] => 5.0
                    [1] => 5.1
                    [2] => 5.2
                    [3] => 5.3
                )

        )

)
2 голосов
/ 09 февраля 2009

Это действительно зависит от типа «настроек», которые вы хотите сохранить. Это настройки начальной загрузки, такие как хост, порт и логин БД? Или это настройки приложения специально для вашего приложения?

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

Базы данных предназначены для чтения и записи без риска для безопасности системы.

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

Также гораздо проще централизовать "данные", для которых требуется резервное копирование, в одном месте.

Могу ли я предложить использовать memcached или нечто подобное, чтобы ускорить его?

Просто пара мыслей ...

2 голосов
/ 09 февраля 2009

PHP имеет функции для чтения файлов .ini.

http://is2.php.net/manual/en/function.parse-ini-file.php

1 голос
/ 09 февраля 2009

Я думаю, что XML через SimpleXMLElement очень полезен для такого рода вещей.

Конфигурация (config.xml):

<config version="1">
  <foo>value</foo>
  <bar>
    <baz>Boo</baz>
  </bar>
</config>

Код для чтения:

$config = simplexml_load_file('config.xml');
$version = (int) $config['version'];
$foo = (string) $config->foo;
$baz = (string) $config->bar->baz;

Код для записи в файл:

$config = new SimpleXMLElement('<config version="1"/>');
$config->foo = 'value';
$config->bar->baz = 'Boo';
$config->asXML('config.xml');

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

0 голосов
/ 09 февраля 2009

Я просто использую массив PHP для конфигурационных файлов.

<?php 
return array
(
    'user' => 'name',
    'pass' => 'word',
    'one_day' => 60 * 60 * 24
);
?>

Некоторые из преимуществ заключаются в том, что, как упомянуто morendil, синтаксический анализ не требуется, он настолько быстр, насколько это возможно, вы можете хранить все виды сложных переменных / уравнений и выполнять следующие действия:

<?php
$config = include 'path/to/file.php';
?>
0 голосов
/ 09 февраля 2009

Рассмотрим объект PHP (или массив), сериализованный в файл. Нет кода для разбора, чтобы написать, достаточно быстро, расширяемый. Единственное предостережение - подумать о стратегии «обновления» файла настроек по мере роста вашего кода для поддержки дальнейших настроек.

...