PHP 源代码中的环境变量

你经常会在 GitHub 上看到一个项目,然后发现原始开发者留下了一个 config.php 文件,其中包含(最好的情况是)无用的数据库信息或(最坏的情况是)极其重要的 API 密钥。

当这些文件没有被意外地版本化时,它们通常会被塞进一个 .gitignore 文件中,并附带一个示例文件,供开发人员根据需要进行修改。WordPress 平台就是这样做的一个例子。

在此基础上还有一些小的改进,比如将核心配置放在一个 XML 文件中,而该文件则被埋藏在一些晦涩难懂的文档中,其中包含大量无关的配置。

我发现有两种管理 PHP 环境变量的好方法。第一种方法是将它们以 YML 等格式放在根目录下的一个文件中,然后根据需要读取这些变量。

第二种方法是由一个名为 dotenv 的库实现的,我个人更喜欢这种方法。从根本上说,我们创建了一个 .env 文件,并将其放在项目里。要从该文件中读取配置,只需调用 env() 函数即可。然后,你就可以将该文件添加到 .gitignore 文件中,这样当你从开发环境推送并拉到其他各种服务器配置时,这个过程就会变得更简单。除此之外,你还可以在网络服务器级别指定环境变量,从而确保额外的安全级别,也使管理变得更加容易。

例如,如果我的 .env 文件有 DB_HOST 属性,我就可以使用 env('DB_HOST'); 访问它。

如果使用 dotenv 方法,请务必确保 .env 文件不是从文档根目录公开可见的。要么将其保留在公共 HTTP 目录之外(例如上一级目录),要么在网络服务器级别限制对其的访问(例如限制权限,或者如果使用 Apache,使用 .htaccess 文件限制对其的访问)。

在撰写本文时,只需运行以下命令即可获取并使用该库:

composer require vlucas/phpdotenv

通过使用配置文件,软代码 通常也可能成为一种反模式。这就是开始将业务逻辑放在配置文件而不是源代码中的情况;因此,值得提醒自己的是,要考虑什么时候真正需要面向配置。