2009-07-26 3 views
2

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

Вот требования у меня есть:

  • Настройки не будут обновлены/добавлены/удалены очень часто. Поэтому обновление настроек не должно быть очень эффективным. Тем не менее, я хочу, чтобы это можно было сделать через PHP-скрипт, а не через редактирование файлов.
  • Настройки будут постоянно читаться, поэтому чтение настроек должно быть очень эффективным.
  • Настройки находятся в уникальном формате, если бы я был в массиве, это могло бы быть чем-то вроде $ Settings ["Database"] ["AccessSettings"] ["Username"] ["myDBUsername"];
    $ Настройки ["База данных"] ["AccessSettings"] ["Пароль"] ["myDBPassword"];

Я бы предпочел не иметь настроек, хранящихся в массивах, как я упоминал выше. Вместо этого я бы предпочел некоторые методы доступа: getConfig («База данных», «Параметры доступа», «Имя пользователя») вернет «myDBUsername». Причиной этого я хочу ограничить переменные, которые я храню в глобальной области.

Что было бы лучшим способом получить/получить их?

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

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

+1

Это один будет интересно. –

+1

См. Мой обновленный ответ ниже. – hobodave

ответ

3

Brian, parse_ini_file - это то, что вам нужно.

Ах, я пропустил требование, что вы редактируете это через PHP.

В этом случае для PHP нет ничего, что вы можете использовать для этой цели. Вам придется сворачивать самостоятельно.

Вы можете сэкономить тонна времени, используя Zend_Config_Ini. Я знаю, что вы заявляете, что не хотите использовать что-либо еще, но Zend Framework структурирована, чтобы вы могли использовать все, что вам нужно. Zend_Config можно использовать самостоятельно. Вы можете просто добавить эти несколько классов в свой проект и позволить им обрабатывать ваш синтаксический анализ INI.

Вот пример, используя ваши образцы выше:

[config] 
Database.AccessSettings.Username = myDBUsername 
Database.AccessSettings.Password = myDBPassword 

Вы бы загрузить и получить доступ к этому так просто, как:

$config = new Zend_Config_Ini('/path/to/ini', 'config'); 
echo $config->Datbase->AccessSettings->Username; // prints "myDBUsername" 
echo $config->Datbase->AccessSettings->Password; // prints "myDBPassword" 

Для редактирования и сохранения конфигурации вы должны использовать следующее:

$config->Database->AccessSettings->Password = "foobar"; 
$writer = new Zend_Config_Writer_Ini(array('config' => $config, 
              'filename' => 'config.ini')); 
$writer->write(); 

Редактировать

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

Чтобы использовать этот флаг с Zend_Config_Writer это так просто следующим образом:

$writer = new Zend_Config_Writer_Ini(array('config' => $config, 
              'filename' => 'config.ini')); 
$writer->setExclusiveLock(true); 
$writer->write(); 

Альтернативный синтаксис:

$writer = new Zend_Config_Writer_Ini(); 
$writer->write('config.ini', $config, true); // 3rd parameter is $exclusiveLock 
+0

Это будет ужасно терпеть неудачу при параллельном доступе несколькими веб-клиентами. – vog

+0

@vog: это то, для чего кеширование. – hobodave

+0

Кроме того, предполагается, что * ЛЮБОЙ * производственный сайт PHP использует некоторый тип кэша байт-кода, который обеспечивает кеш пользователя, такой как APC. – hobodave

0

Если вы не редактируете руки, используйте сериализованные данные.

Запись конфигурации с использованием serialize:

file_put_contents('myConfig.txt', serialize($Settings)); 

Чтения конфигурации с помощью unserialize:

$Settings = unserialize(file_get_contents('myConfig.txt')); 

Вы могли бы написать класс для модификации и получения значений для этих данных с помощью PHP магических функций __get() и __set().

+0

Это приведет к сбою при параллельном доступе нескольких клиентов. – vog

+0

Просьба уточнить, конечно, у вас были бы столкновения с несколькими сеттерами, но с несколькими читателями проблем не возникло бы. Автор вопроса говорит: «Настройки не будут обновляться/добавляться/удаляться очень часто, поэтому обновление настроек не должно быть очень эффективным. Однако я хочу, чтобы это можно было сделать через PHP-скрипт, а не через редактирование файлов ". –

+0

@Crad: Хотелось бы проголосовать за комментарии. – hobodave

0

Если вы готовы отказаться в библиотеке, вы можете использовать Spyc и иметь вашей конфигурации в файле YAML.

Вы также можете использовать PHP's support for SQLite, что означает, что ваша база данных - это просто файл, поэтому нет необходимости в сервере БД.