Как лучше всего хранить динамические настройки в php?

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

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

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

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

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

Спасибо!


person anonymous-one    schedule 20.07.2011    source источник
comment
Почему вы не хотите использовать именно MySQL?   -  person Sjoerd    schedule 20.07.2011
comment
Хотелось бы избежать дополнительных 10000000 или около того ежедневных запросов. Да, они попадут в кеш запросов в 99,999% случаев, но все же у нас есть исходная база, где многие сценарии в стиле cron даже не подключаются к mysql.   -  person anonymous-one    schedule 20.07.2011
comment
Мне интересно, действительно ли чтение файла с помощью file_get_contents и его разбор (или что вы с ним делаете) дешевле, чем запрос MySql?   -  person nobody    schedule 20.07.2011
comment
Это делается только в обновлениях. Которые происходят раз в несколько часов. В противном случае он включается через include(... Так что, читая, он наверняка намного дешевле. Изменения нечасты, очень нечасты.   -  person anonymous-one    schedule 20.07.2011


Ответы (5)


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

Использование родного парсера

Парсер, написанный на C, скорее всего, будет быстрее, чем парсер на PHP. Два варианта, которые приходят на ум, это

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

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

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

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

Отказ от частичного сохранения

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

person gnud    schedule 20.07.2011
comment
Внимание: относительно использования mv для предотвращения частичного сохранения. это работает, но убедитесь, что источник и цель находятся в одной и той же файловой системе. в противном случае метод «изменения inode» не может быть использован. - person anonymous-one; 05.09.2011
comment
я проголосовал за этот ответ, потому что в итоге мы оставили все как есть, просто реализовав метод mv, чтобы избежать частичного сохранения. - person anonymous-one; 06.09.2011

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

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

О, Боже.

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

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

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

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

person symcbean    schedule 20.07.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 ... */
}

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

person nobody    schedule 20.07.2011
comment
совет принимает решение о погоде, чтобы пойти по маршруту mysql. наверное так и будет. причина, по которой я решил заняться этим сейчас, заключается в том, что нам нужны эти настройки для совместного использования между ящиками. и mysql кажется лучшим способом сделать это. - person anonymous-one; 20.07.2011

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

person Karl Laurentius Roos    schedule 20.07.2011
comment
Что, вероятно, будет ужасно неправильным при одновременном доступе и частых обновлениях. :( - person symcbean; 20.07.2011
comment
Пока это выглядит наиболее многообещающе. Похоже на то, что мы делаем сейчас, но похоже, что это немного упростит ситуацию. По крайней мере, в отношении сохранения/обновления/извлечения. Мы можем справиться с синхронизацией по нескольким серверам отдельно. - person anonymous-one; 20.07.2011
comment
У нас есть те же проблемы с обновлением, что и при использовании метода ручной загрузки файлов. Пару раз в день php выдает синтаксическую ошибку, потому что файл находится в середине записи. Да, мы пытались поставить флаг содержимого файла для блокировки, но безрезультатно. Извините за отсутствие дополнительной информации в аэропорту, пишущей по телефону. - person anonymous-one; 20.07.2011

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

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

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

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

person malko    schedule 20.07.2011