2009-02-08 5 views
6

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

+0

Я на самом деле просто столкнулся с этим же, спасибо Skippy! – helloandre

+0

Рад, что это может помочь кому-то еще! –

ответ

15

Я часто использую РНР 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 
       ) 

     ) 

) 
+0

+1 для всего образца кода – cbrulak

+0

Удивительный ответ! Быстро и полно! Благодаря! –

+0

Вау, я этого не знал! Большое спасибо! – strager

0

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

1

Я думаю, что 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'); 

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

2

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

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

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

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

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

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

всего пару мыслей ...

0

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

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

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

<?php 
$config = include 'path/to/file.php'; 
?> 
+0

Фактически синтаксический разбор * необходим *, и можно утверждать, что синтаксический анализ и выполнение PHP-кода - более сложная задача, чем извлечение строк для .ini-файла. Тем не менее, я согласен с тем, что использование PHP - это самый простой способ. – che

+0

Я имею в виду не ручное разбор, а массив можно кэшировать в APC;) – Mario

+0

Вместо массива, не лучше ли/быстрее использовать класс? –

Смежные вопросы