正如您所说,最简单的方法是使用配置文件。
许多框架都使用它(Zend、CakePHP、Kohana等),它是最常见的做事方式(即使在非 PHP 环境中,例如带有web.config
文件的 ASP.NET)。这使您还可以通过仅复制站点的文件来将配置值从一个环境复制到另一个环境,这比依赖于服务器设置环境变量(可能很快丢失和忘记)有好处。
您不必担心密码的混淆,因为它不是一个世界可访问的文件,它当然不应该是网络可访问的。我的意思是,您要么 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忽略该文件。另一方面,您可能希望文件的骨架或具有合理默认值的骨架(后者当然不适用于登录数据)进行版本控制。处理这个问题的一种常见方法是拥有一个签入的模板配置文件,安装过程将该文件复制到实际配置文件的位置,在那里进行定制。这可以是手动或自动化的过程。
(虽然与主要问题有些无关,但为您的环境引入一个常量可以让您做一些其他很酷的事情,例如推迟到假邮件实现而不是实时SMTP实现,但当然这也可以通过配置文件完成)