Каков наилучший способ хранить динамические настройки в php? - PullRequest
0 голосов
/ 20 июля 2011

Интересно, есть ли у кого-нибудь хорошая система для хранения / обновления динамических настроек в php?

Под динамикой я подразумеваю настройки, которые автоматически изменяются другими сценариями.

В настоящее время мы используем систему, которая в основном file_get_contents нашего php-файла настроек, обрабатывает его как строку, изменяет настройки, а file_put_contents обновляет настройки.

Это работает, но немного грязно. Любые другие рекомендации, где мы можем хранить / изменять / извлекать эти настройки? Mysql не вариант, мы хотим избежать лишних запросов.

В качестве дополнительного бонуса некоторые системы, которые могут обмениваться этими данными на нескольких серверах, так как многие из этих настроек используются в нескольких боксах. Но я полагаю, что мы можем справиться с этим по отдельности.

Thx!

Ответы [ 5 ]

2 голосов
/ 20 июля 2011

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

Mysql - это НЕвариант, мы хотим избежать дополнительных запросов

О, дорогой.

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

Действительно, я бы порекомендовал реализовать хранение и извлечение значений в пользовательском обработчике сеанса с привязкой к базе данных.(и включение сеансов для всех запросов).

Существуют и другие инструменты, которые вы можете использовать - базы данных nosql и memcache - очевидные кандидаты - но они теряют смысл, когда у вас уже есть экземпляр MySQL.

(общая память и хранилище переменных APC имеют те же проблемы, что и хранилище на основе файлов)

1 голос
/ 20 июля 2011

О чем следует помнить, если вы придерживаетесь файлового подхода:

Использование собственного синтаксического анализатора

Синтаксический анализатор, написанный на C, скорее всего будет быстрее, чем один в PHP.На ум приходят два варианта:

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

<?php return
array(
'key' => 'value'
);

Этот файл может быть include -d один или несколько раз, а includeоператор вернет массив конфигурации.Когда вы пишете новые настройки, используйте var_export(), чтобы получить действительный код php.

Другой подход заключается в использовании файла settings.csv.Чтение с использованием fgetcsv(), запись с использованием fputcsv().

Предотвращение «частичного» сохранения

Чтобы избежать частичного чтения файла во времяНастройки обновляются, сначала запишите новые настройки во временный файл, затем переместите этот файл в папку с файлами настроек (желательно, используя mv (1) на * nix).

1 голос
/ 20 июля 2011

Если вы не хотите использовать MySql, я думаю, что то, что вы делаете сейчас, является лучшим решением, любая система записи свойств / ini-файлов будет намного дороже и не решит проблемы одновременного доступа.Чтобы устранить эту проблему, я предлагаю вам записать обновленный файл во временный файл в той же папке, удалить старый файл settings.php и переименовать временный файл в settings.php.Существует небольшая вероятность того, что запрос будет сделан сразу после удаления settings.php и до переименования временного файла, что можно сделать, выполнив что-то вроде этого, если вы включите файл:

if( file_exists( 'settings.php' ) ) {
    include( 'settings.php' );
} else {
    /* ... wait 100 miliseconds or so and try again... do this a few times and then fail ... */
}

это должнобыть в полной безопасности.

0 голосов
/ 20 июля 2011

Для этого мы используем это: http://projects.jgotti.net/projects/simplemvc/browse/trunk/includes/fx-conf.php он читает и записывает в простые текстовые файлы, которые содержат пары ключ = значения.

parse_conf_file может загружать confs как определенные значения или возвращать ассоциативный массивключевых значений.Write_conf_file позволяет перезаписывать только необходимые значения, передавая массив значений ключей в качестве параметров.

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

Надеюсь, что это поможет

0 голосов
/ 20 июля 2011

Я бы сказал, ini файлы. parse_ini_file() (http://php.net/manual/en/function.parse-ini-file.php) - отличная функция, которая заботится о чтении, и ответ на письмо прямо здесь: создайте ini-файл, запишите значения в PHP

...