Как правильно организовать хранение и чтение настроек сайта?
Собственно, разрабатываю сайт на php. Столкнулся с вечным вопросом хранения настроек сайта. Варианты, которые рассматривал: mysql база и ini файлы.
Но вот вопрос, если хранить настройки в базе, то когда происходит чтение из базы, мы совершаем запрос. А если надо прочитать 30 настроек, то будет +30 запросов, что при большой посещалке скажется на производительности.
Или стоит делать запрос в базу один и извлекать все необходимые данные сразу, а потом только их подставлять куда надо?
А если рассматривать ini файлы, то там тоже получается при каждом вызове настройки, необходимо каждый раз читать файл и каждый раз извлекать одно нужное нам поле. Или лучше читать весь файл сразу и извлекать из памяти необходимое? Тогда забивается память на мой взгляд.. как тогда быть? Как правильно организовать настройки и их чтение?
Прошу учитывать изначально хранение тысячу полей в настройках (как в cms это обычно бывает).
Предложу тогда и свой вариант. Храните настройки в сериализованом виде: как только сайт открывается, он проверяет наличие файла (например: settings.dat), если файл найден - читает его и делает unserialize - на выходе получается массив настроек. Если файла нет - делаете запрос в базу (как предлгал @VasiliyIsaichkin) и затем полученный массив настроек сохраняете в файл (например settings.dat) через serialize функцию + при каждом изменении настроек CMS - удаляйте файл settings.dat и он будет снова синхронизирован с БД.
Добрый день! А скажите нормальный ли вариант хранить в БД и при посещении сайта, если в сессии нет настроек - сохранять в сессию, ну и далее брать их с сессии, чтобы не дергать БД
Поскольку задаются такие вопросы, думается мне, что 30+ запросов к базе - не самый большой косяк на будущем сайте.
Храните в начале файла индекс точка похапе и дело с концом.
Если настройки меняются редко, то читать весь файл файл. Про память - вы плохо соотносите расходы на нее, у вас будет 1-2 кб, соединение с SQL съест гораздо больше.
Не там оптимизируете и не о том думаете. 30+ запросов вообще бред какой-то.
Для хайлоада можно использовать какой-нибудь НРСХД типа redis...
@VasiliyIsaichkin ну это 30 запросов для настроек, а еще 30 запросов для других каких данных (новости, комментарии и т.п.) получается 60 - существенно для высоко нагруженного проекта (хотя и не факт, чисто моё мнение).
Получается, если у меня в файле 1000 строк с настройками, мы лучше читаем его целиком и извлекаем необходимые данные, либо читаем каждый раз но по одной строке, чтобы не держать в памяти?
Вы драгоценный iops готовы гробить ради копеешной памяти? 1000 строк с настройками это ну 10 ну 40 кб. Накладных расходов на SQL соединение будет гораздо больше.
@VasiliyIsaichkin Можно. Вот я и хотел уточнить, все данные извлекать из таблицы сразу или нет (по одной записи), когда объём таблицы настроек 1000 полей.
select * from settings
или
select value from settings WHERE key = 'something'
Ну мля как же непонятно что вызов одного запроса хавает диска, памяти и проца в тысчи раз больше? (для этого случая) Ну 1000 полей и 1000 полей. Если бы 100к, то да надо думать. В конец концов можно ввести группы настроек - добавьте поле group и дергайте настройки которые нужны для этой страницы
@Quber если настройки меняются редко (или только одним человеком) то да - это и проще и быстрее сделать. Хранить можно не в ini а сериализовав в json_encode/json_decode к примеру
Добрый день! А скажите нормальный ли вариант хранить в БД и при посещении сайта, если в сессии нет настроек - сохранять в сессию, ну и далее брать их с сессии, чтобы не дергать БД
@VasiliyIsaichkin я не знаю, при чём тут php.ini Я про него не писал, это вы написали. Я же имел ввиду про тип файла, в котором хранить настройки. Исходя из Ваших слов, можно предположить, что mysql отбрасываем. Тогда след. вопрос. Извлекать из файла все данные сразу и читать из массива необходимые данные или читать по одной строке из файла на каждый запрос?