正如你所说,最简单的方法是使用配置文件.
许多框架都使用这种方式(Zend、CakePHP、Kohana等),这是最常见的操作方式(即使在非PHP环境中,如ASP.NET及其web.config
文件).这还允许您通过复制站点的文件,将配置值从一个环境复制到另一个环境,这比依赖服务器设置环境变量(很快就会丢失和忘记)有好处.
你不需要担心密码的混淆,因为它不是一个世界范围内可访问的文件,它当然不应该是网络可访问的.我的意思是,您可以a)告诉您的web服务器不要为您的配置文件提供服务(IIS已经为web.config
个文件提供了服务,并提供HTTP 404.8状态,而不是内容),或者b)将其移到web服务目录之外.如果有人能看到你的配置文件,那就比把它放在源代码中更糟糕了.
配置文件的基本(空/缺省)版本也是一个好主意,并根据环境将其分开,这样您就可以为生产、开发和测试平台使用不同的配置文件.
环境变量是区分这些环境最常用的方法,类似于下面的代码:
// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
// Copy from web server to PHP constant
define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}
if (!defined('ENVIRONMENT')) {
// Default to development
define('ENVIRONMENT', 'development');
}
// Load in default configuration values
require_once 'config.default.php';
// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';
另一种非常常见的方式是使用XML配置文件,并且只根据需要读取您需要的值(在内存中存储配置文件的缓存副本).这可以很容易地限制为只加载特定的值,而不是允许任意包含PHP文件,在我看来,这总体上是一个更好的解决方案,但上面的方法应该会让您朝着正确的方向开始.
您可能希望您的VCS忽略该文件.另一方面,您可能希望文件的框架或具有合理缺省值的框架(当然后者不适用于登录数据)受到版本控制.处理这一问题的一种常见方法是有一个签入的模板配置文件,安装过程会将该文件复制到实际配置文件的位置,并在那里对其进行自定义.这可以是手动的,也可以是自动的.
(Whilst somewhat unrelated to the main question, introducing a constant for your environment allows you to do some other cool stuff like deferring to a fake mail implementation instead of a live 100 one, but of course this could also be done with a configuration file)