Лучший способ сохранить Настройки Приложения PHP?

Что лучший подход к хранению группы глобальных настроек для пользовательского приложения PHP? Я работаю над персональным проектом (сначала главный действительно) и нуждаюсь в методе хранения пар "ключ-значение" для записи полных настроек для приложения.

Вещи сохранить как...

  • Глобальное имя веб-сайта.
  • Тема (просто переменная или путь к теме)
  • и т.д.

Я должен просто сохранить их в одной таблице? Раз так, что лучший способ состоит в том, чтобы запросить их от boostrap? Помимо выполнения единого запроса для каждой желаемой установки.


ОБНОВЛЕНИЕ: Да .ini или парсинг включать файла были бы хороши, и я знаю, как сделать это тот путь. Но я хотел знать то, что будет лучшим подходом к хранению их в MySQL со всем остальным.


UPDATE2: причина я спрашиваю это также, я планирую много этих настроек быть изменяемым через интерфейс Administrator. Таким образом, если бы необходимо было изменить Заголовок сайта, то он был бы обновлен сразу же, который я изобразил, было бы лучшим сделать через SQL, таким образом нуждаясь устанавливающий в DB.

12
задан Urda 3 March 2010 в 02:34
поделиться

7 ответов

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

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

AppSettings.php

<?php
$_SITENAME_ = 'MyWebsite';
$_THEME_ = 'Theme/Path';
?>

UPDATE:

Я предполагаю, что вы хотите, чтобы эти настройки можно было редактировать через веб-страницу и не хотите многочисленных запросов к БД, поскольку эти настройки будут меняться, но не слишком часто?

Один из подходов, который я использовал лично, заключался в сериализации таблицы AppSettings и хранении ее в XML файле. Разумеется, каждый раз, когда таблица обновляется, она повторно сериализуется и сохраняется в XML-файле. Затем я создал отдельный класс, который анализирует XML-файл и возвращает нужные мне значения.

6
ответ дан 2 December 2019 в 04:43
поделиться

Мы просто используем

$siteConfig['db_name'] = 'database1';
$siteConfig['site_name'] = 'Stackoverflow';

во включенном php файле. Помещение значений в массив помогает при конфликтах имен.

2
ответ дан 2 December 2019 в 04:43
поделиться

Я понимаю, что вы хотите сохранить данные в таблице mysql, однако это, вероятно, означает сохранение необходимой конфигурации в нескольких местах. например, я уверен, что вы захотите, чтобы сервер базы данных и имя хранились где-нибудь в строке. это означает размещение их в файле include или .ini, поскольку вы не можете прочитать их из базы данных (как вы можете подключиться к базе данных, не зная об этом). Итак, вы бы сохранили информацию о подключении к базе данных в файле include или .ini, а остальные настройки в базе данных? я полагаю, это работает, но мне нравится хранить все настройки в одном файле (config.php или application.ini или что-то еще). это упрощает обслуживание imo.

-don

2
ответ дан 2 December 2019 в 04:43
поделиться

Только что закончил болтать об этом с несколькими людьми в IRC. Я посмотрел, как Wordpress справился с этим после того, как вытащил дамп SQL одной копии. Думаю, я воспользуюсь этим макетом и немного переименую столбцы. Но идея в том ...

option_id | option_name | option_value | autoload
int       | varchar     | longtext     | varchar
(PRIMARY) | (UNIQUE)    |              |
2
ответ дан 2 December 2019 в 04:43
поделиться

Я обычно в своем файле index.php устанавливаю "обязательные" параметры так:

<?php
session_start();
ob_start();

define('BASEPATH', $_SERVER['DOCUMENT_ROOT'].'/_setUp/siteSetup/');      // CHANGE TO THE PATH OF THE SITE.
define('URIPATH', 'http://localhost/_setUp/siteSetup/');                // CHANGE TO THE URL OF THE SITE.
define ('DEBUGGER', true);                                              // CHANGE TO FALSE TO HIDE DEBUG MESSAGES
include(BASEPATH.'system/lib/config.lib.php');
?>

и в моем файле конфигурации:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// public

/* 
example:
    <img src="<?php echo IMG ?>my_image.jpg">
    http://localhost/public/images/
    <img src="http://localhost/public/images/my_image.jpg">
*/
define('CSS', URIPATH.'public/css/');                   // DEFINE DIR: css
define('IMG', URIPATH.'public/images/');                // DEFINE DIR: images   
define('JS', URIPATH.'public/scripts/');                // DEFINE DIR: scripts

// system
define('INC', BASEPATH.'system/includes/');             // DEFINE DIR: includes
define('LIB', BASEPATH.'system/lib/');                  // DEFINE DIR: lib
define('SQL', BASEPATH.'system/sql/');                  // DEFINE DIR: sql

if (DEBUGGER) {
    ini_set('log_errors',TRUE);
    ini_set("error_log", BASEPATH.'system/'."error_log.txt");
}
else {
    ini_set('log_errors',TRUE);
    ini_set("error_log", BASEPATH.'system/'."error_log.txt");
}

$db_info = array(
    'host' => 'localhost',
    'username' => 'root',
    'password' => 'root',
    'database' => 'my_db'
);


/*
to use:
    $db_info = unserialize(DB_INFO);
    echo $db_info['host'];
    echo $db_info['username'];
    echo $db_info['password'];
    echo $db_info['database'];
*/
define('DB_INFO', serialize($db_info));
?>
0
ответ дан 2 December 2019 в 04:43
поделиться

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

Для сайтов с высоким трафиком и большими конфигурациями кэширование данных конфигурации в APC (например, в виде единого массива) является хорошей идеей - по крайней мере, вы экономите накладные расходы, связанные с фактическим выполнением операторы в вашем файле config.php. Примечательно, что это делает facebook. Когда вы обслуживаете много запросов в секунду, не может быть и речи об обращении к диску для чтения файла конфигурации (с использованием parse_ini_file, анализатора XML и т. Д.) Для каждого запроса.

В моем текущем проекте мы размещаем множество сайтов, каждый со своей собственной конфигурацией. У каждого сайта была и база данных, и файл конфигурации; однако проверка того, что вы всегда используете правильный файл конфигурации с правильной базой данных, может стать головной болью. Кроме того, изменения потребуют изменения вещей в двух местах - db и config. Забывание того или другого всегда приводило к проблемам, и происходило это слишком часто.

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

Итак, резюмируем:

  1. Маленький сайт : просто используйте конфигурацию.php файл
  2. Очень большой сайт : кеш в APC
  3. Несколько сайтов : сохранить конфигурацию в базе данных, чтобы уменьшить накладные расходы на администрирование; кэш в APC, чтобы уменьшить количество обращений к базе данных
20
ответ дан 2 December 2019 в 04:43
поделиться

Достойным подходом было бы получение часто используемых настроек один раз на страницу через базу данных. Что-то вроде сохранения логического поля autoload , которое проверяет, следует ли загружать параметр вместе со страницей. Для других, гораздо менее распространенных настроек, вы можете получить их по воздуху.

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

0
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: