2009-02-27 3 views
24

Мне нужно сохранить кучу информации о конфигурации в PHP.Каков наилучший способ хранения переменных конфигурации в PHP?

Я рассмотрел следующее ....

// Doesn't seem right. 
$mysqlPass = 'password'; 

// Seems slightly better. 
$config = array(
    'mysql_pass' => 'password' 
); 

// Seems dangerous having this data accessible by anything. but it can't be 
// changed via this method. 
define('MYSQL_PASSWORD', 'password'); 

// Don't know if this is such a good idea. 
class Config 
{ 
    const static MYSQL_PASSWORD = 'password'; 
}  

Это все, что я думал до сих пор. Я намерен импортировать эту конфигурационную информацию в свое приложение с require /config.inc.php.

Что работает для вас в отношении хранения данных конфигурации, и какие наилучшие практики касаются этого?

ответ

7

Я всегда ездил с вариантом № 2 и просто гарантировал, что никто, кроме владельца, не имеет никакого доступа к нему. Это самый популярный метод среди приложений PHP, таких как Joomla, vBulletin, Gallery и многие другие.

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


Пример ..

define('EXAMPLE1', "test1"); // scenario 1 
$example2 = "test2"; // scenario 2 

function DealWithUserInput($input) 
{ 
    return eval($input); 
} 

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

Сценарий 2 вызовет проблему только в том случае, если вы сделали его глобальным в пределах функции. В противном случае он выходит за рамки и недоступен.

+0

Опасно ли это в том, что если какой-либо пользовательский ввод входит с MYSQL_PASSWORD, он может быть передан с фактическим паролем? – alex

+0

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

+0

Отредактированное сообщение, чтобы привести пример по двум различным способам, которые вы могли бы иметь в своем коде, и как пользователь мог получить информацию. –

1

Обычно я использую второй метод ... При обработке соединений с базой данных я обычно открываю соединение в начале запроса, а затем закрываю его в конце. У меня есть функция, которая устанавливает соединение, а затем удаляет имя пользователя/пароль из глобального массива (с помощью функции unset()). Это предотвращает доступ других частей системы к «чувствительным» данным соединения mysql.

0

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

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

+0

Да, это правда, за исключением случаев, когда вы хотите отредактировать один файл, чтобы иметь возможность изменять любые данные конфигурации, тогда константы, привязанные к классу Db, затруднят работу, чем одна точка доступа (именно это я хочу) – alex

4

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

Я использую Zend Config Ini для этого и других настроек, хранящихся в SQL DB.

+0

Никогда не слышал об этом методе раньше. Хорошо знать! –