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

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

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

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

Как лучше всего их получить?

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

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

2
Brian 27 Июл 2009 в 03:13

4 ответа

Лучший ответ

Брайан, вам нужно 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();

Изменить

Не совсем уверен, почему люди голосуют против этого из-за ошибочных комментариев vog. Сделать это доступным для записи несколькими людьми очень просто с помощью монопольной блокировки. 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
3
hobodave 27 Июл 2009 в 15:27

Файлы DBM могут быть неплохой идеей. PHP имеет встроенную поддержку для различных разновидностей файлов DBM:

http://www.php.net/manual/en/book.dba.php

0
Rafe 26 Июл 2009 в 23:45

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

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

0
Nathan 26 Июл 2009 в 23:44

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

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

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

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

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

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

0
Gavin M. Roy 26 Июл 2009 в 23:18