在PHP中,存储配置变量的最佳方式是什么?

26

我需要在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将这些配置信息导入我的应用程序。

关于存储配置数据,你有哪些建议和最佳实践?

4个回答

7
我一直采用第二种方法,确保只有所有者拥有任何形式的访问权限。这是像Joomla、vBulletin、Gallery和其他许多PHP应用程序中最流行的方法。
对我来说,第一种方法太混乱(可读性),第三种方法太危险了。我从未想过类方法,所以其他人可以提供他们的意见。但我想只要在类的使用上使用正确的访问权限,那么这种方法也是可以的。
例如...
define('EXAMPLE1', "test1"); // scenario 1
$example2 = "test2"; // scenario 2

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

现在这个代码示例非常愚蠢,但只是一个例子。考虑根据用户输入尝试使用哪种场景,函数可能返回什么。

如果您将场景2作为函数内的全局变量,则只会导致问题。否则它超出了范围并且无法访问。


如果某个用户输入了MYSQL_PASSWORD,它是否会与实际密码一起传递,这种情况是否危险? - alex
如果你按照你列出的第二种方法去做,那么可能会发生这种情况。它本质上将其设置为全局变量,在任何作用域中都可见。你可以选择类或函数如何访问$config数组,只要你不在错误的作用域中可见,就应该没问题。 - William Holroyd
8
无论是否定义了常量,对用户输入进行评估都是危险的。有人能否提供另一个定义常量“过于危险”的例子? - chyne
我也同意以上关于eval()的评论。这就是为什么我加了注释“现在这个代码示例真的很愚蠢,但只是一个例子。”只是一个过度简化和不太可能发生的例子。但对我来说,MySQL密码永远不应该被定义为常量,并对所有人可见。 - William Holroyd
不应该存在这样的理由,使得它那么容易被访问。这就像假设每个进入办公楼前门的人都是有责任和目的的 - 所以没有理由在建筑物内部锁定办公室和实验室。它只应该对使用它的代码可见。 - William Holroyd
显示剩余4条评论

4

我认为这也在一定程度上取决于用户群。如果配置需要非常用户友好或用户需要通过网络等方式更改配置,则需要考虑这些因素。

我使用Zend Config Ini来处理这个问题,而其他设置则存储在SQL数据库中。


以前从未听说过这种方法。好知道! - William Holroyd

1

通常我使用第二种方法……在处理数据库连接时,我通常会在请求开始时打开连接,然后在请求结束时关闭它。我有一个函数来建立连接,然后使用unset()函数从全局数组中移除用户名/密码,这可以防止系统的其他部分访问“敏感”的MySQL连接数据。


0

对于大多数配置值,我也支持选项2。如果您要实现该类,则应将特定值绑定到受其影响的类,而不是通用配置类。

在您的示例中,您的类将用于数据库连接,一个实例将保存密码、db_name等。这将适当地封装数据,并提供创建多个连接的简便方法(如果需要的话)。


是的,这是正确的,除非您想编辑一个文件以更改任何配置数据,那么附加到 Db 类的常量将比单个访问点(这就是我想要的)更加困难。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接