Способы сохранения конфигурации для веб-приложения, написанного на PHP?
Я видел, как люди использовали .ini, basic.php и т.д.
Кроме того, define()
или простые глобальные переменные?
Большинство информации, как вы можете найти.
Кроме того, являются ли базы данных хорошими методами хранения конфигурации?
Хранилище конфигурации PHP
Ответ 1
Для сохранения ваших конфигураций приложений нет "Лучший способ (tm)". На самом деле все зависит от вашего приложения, от типа конфигураций, от того, как часто они могут/должны изменяться, и насколько легко вы хотите его изменить.
Некоторые люди используют полный одиночный (или статический) класс Config
для своего приложения. Что выглядит примерно так (с разной степенью сложности):
<?php
class Config
{
protected static $config = array();
private function __construct() {} // make this private so we can't instanciate
public static function set($key, $val)
{
self::$config[$key] = $val;
}
public static function get($key)
{
return self::$config[$key];
}
}
Это удобно, потому что вы можете называть его везде, где хотите, с помощью Config::set()
или Config::get()
. Затем у вас есть центральное место, где настроено все ваше приложение, и вы можете сделать его настолько сложным или простым, как вам нравится. Вы можете вернуть все в базу данных, memcached и т.д., Что угодно.
Это подводит меня к следующему. Использование базы данных прекрасно подходит для вещей, которые необходимо изменить "на лету" и необязательно иметь "начальную настройку". Примером могут быть функции настройки приложения сайта (например, валюта, цвет фона, изображение заголовка и т.д.). Проблема здесь в том, что вы должны загружать ее каждый раз, когда страница загружается в ваше приложение. Чтобы решить эту проблему, вы можете использовать технологию кэширования среднего уровня (например, memcached, если хотите). Это было бы быстро, быстрее, чем база данных, но все же добавляет накладные расходы, потому что вы должны загружать их при каждой загрузке страницы.
Самый быстрый способ, и, следовательно, "самый трудный" для изменения - использовать файл config.php
или тому подобное. Этот файл будет иметь определения ключа массива $_GLOBALS
или define()
для значений, к которым вам нужен доступ во всем приложении. Это быстро, потому что оно включено в запрос и жестко закодировано в PHP, поэтому все, что нужно PHP, это интерпретировать файл - отсутствие сетевого ввода-вывода или каких-либо дополнительных накладных расходов, кроме минимальных издержек, включая файл в ваш script. То, что вы храните в этих файлах PHP, такие вещи, как ваши учетные данные подключения к MySQL, учетные данные подключения к веб-сервису и т.д.
Для приложения, которое имеет много пользователей и множество настроек, вам, вероятно, потребуется развернуть & lsquo; hybrid & rsquo; методов или придумать свои собственные. Для чего-то, что является стандартным развертыванием приложений, вы можете уйти с очень простым подходом типа config.php
.
Ответ 2
Я не думаю, что есть лучший способ, каждый метод имеет свои преимущества и недостатки. Просто убедитесь, что файл конфигурации (особенно когда он содержит пароли) недоступен в общедоступном каталоге, но где-то закрыт.
Сохранение конфигурации в базе данных может работать, но вам все равно нужно сохранить информацию о подключении к базе данных где-нибудь, чтобы получить соединение. Я лично никогда не был поклонником этого метода. Единственным преимуществом было бы легкое онлайн-изменение значений элементов конфигурации или настройка конфигурации на уровне пользователя, например.
Использование define();
создаст константы, из которых вы не сможете изменить значение во время выполнения. В некоторых случаях это работает, в других случаях это не так. Если вы хотите, чтобы ваша конфигурация была доступна повсюду - в любой области - вы могли бы подумать о том, чтобы прочитать конфигурацию в классе (возможно, шаблон Singleton?), Чтобы вы могли получить доступ к значениям конфигурации везде.
Я использовал прилагаемый файл php, файлы .ini, файлы XML и файлы JSON для конфигурации, лично я предпочитаю избегать файлов конфигурации .php, поскольку я делюсь файлами конфигурации между несколькими языками для разных приложений в своих веб-приложениях, и придерживаться других "стандартов".
Ответ 3
.ini не является хорошим способом хранения конфигураций, поскольку веб-сервер собирается отображать его на публике. Не делайте этого.
Сохранить конфиги в файле .php. Вы можете использовать глобальные переменные, define() или обычные переменные. Определить, как правило, лучше всего. Для большей безопасности заставьте его за пределами общедоступного каталога.
Обычно я устанавливаю параметры базы данных в config.php и все динамические настройки в базе данных. Все настройки, которые не сильно меняются, обычно хороши для размещения в файле конфигурации. Как пути и т.д.
Ответ 4
Как указывал @Roger Ng, принятый ответ на самом деле не работает. Проблема в том, что вы не можете использовать $this
в статическом методе.
PHP: статическое ключевое слово - руководство
Я подумал об управлении этим следующим образом:
class Config {
protected static $config=array();
private function __construct(){}
public static function set($k,$v){
self::$config[$k]=$v;
}
public static function get($k){
return self::$config[$k];
}
public static function init($a){
self::$config=$a;
}
public static function merge($a){
self::$config=array_merge(self::$config,$a);
}
}
Я использую функцию Config::init()
для создания конфигурации по умолчанию, чтобы вернуться к ней, и Config::merge()
для объединения конфигураций по умолчанию, например, с производственными значениями.
Итак, мой default_config.php может выглядеть следующим образом:
Config::init(array(
'key' => 'value',
'key2' => 'value2',
));
И мой config.php что-то вроде следующего:
Config::merge(array(
'key' => 'newvalue',
'key3' => 'value3',
));
В фактическом коде я получаю свои значения конфигурации точно так, как это делается в принятом ответе, написав Config::get('key')
.
Ответ 5
IMO, сегодня имеет смысл хранить ваши данные конфигурации в файле JSON.
Некоторые преимущества JSON:
- встроенная поддержка во многих языках программирования
- легко читается для людей
- легко читается для машин
- small filesize
Пример кода:
Файл Json:
{
"version" : "0.0.1",
"title" : "My first web app",
"database" : {
"host" : "localhost",
"name" : "DB",
"user" : "JJ",
"password" : "Passw0rd"
}
}
Класс PHP:
namespace App;
class Config {
protected static $config = array();
public static function load($filename) {
static::$config = json_decode(file_get_contents($filename), true);
}
[...]
}
Загрузка вашего Json файла:
\App\Config::load('myConfigFile.json');
Ответ 6
Это то, что я делаю.
Сначала я определяю общий Dataset
класс, который я могу использовать для глобального хранилища данных:
<?php
namespace MyNamespace\Core;
class Dataset {
protected static $_data = array();
public static function set($key, $value) {
static::$_data[$key] = $value;
}
public static function get($key) {
return static::$_data[$key];
}
public static function remove($key) {
unset(static::$_data[$key]);
}
}
?>
Затем я определяю класс Config
, который расширяет его, где я могу добавлять методы, специфичные для этого класса.
<?php
namespace MyNamespace\Core;
class Config extends Factory {
protected static $_data = array();
}
?>
Обратите внимание, что важно добавить правило protected static $_data = array();
в класс Config
или любые другие дочерние классы, если вы не хотите, чтобы они делили один и тот же массив.
Ответ 7
Я изменил код Джеймсом и Зачу. Вот моя реализация. Когда выполняется поиск значения, и если существует, оно возвращается, иначе возвращается пустая строка. Таким образом, никаких уведомлений не будет. Там есть метод удаления. комментарии и форматирование кода.
<?php
/*
* This file can be used to store config values. It is based on discussion below.
* @see https://stackoverflow.com/info/5923778/php-configuration-storage
* @author https://stackoverflow.com/users/2632129/james
* @author https://stackoverflow.com/users/3173125/zachu
* @author Slavi Marinov | http://orbisius.com
*/
class App_Config {
protected static $config = array();
/**
* Do not instantiate this class
*/
private function __construct() {}
/**
* Initializes or resets the config if nothing is supplied
* App_Config::init();
* @param array $a
*/
public static function init($a = array()) {
self::$config = $a;
}
/**
* App_Config::get();
* @param str $k
* @return mixed
*/
public static function get($k) {
return empty(self::$config[$k]) ? '' : self::$config[$k];
}
/**
* Sets a value
* App_Config::set();
* @param str $k
* @param mixed $v
*/
public static function set($k, $v) {
self::$config[$k] = $v;
}
/**
* Removes a key
* App_Config::remove();
* @param str $k
* @param mixed $v
*/
public static function remove($k) {
unset(self::$config[$k]);
}
/**
* Removes a key
* App_Config::delete();
* @param str $k
* @param mixed $v
*/
public static function delete($k) {
self::remove($k);
}
/**
* App_Config::exists();
* @param str $k
* @return bool
*/
public static function exists($k) {
return isset(self::$config[$k]) ? true : false;
}
/**
* App_Config::merge();
* @param str $k
* @return array
*/
public static function merge($a) {
self::$config = array_merge(self::$config, $a);
return self::$config;
}
}