在PHP中使用动态配置文件有什么问题


What is wrong with having a dynamic configuration file in PHP?

我最近开始将我的网站文件转换为可以在任何路径上工作的文件。我正在使用虚拟主机来维护与主生产服务器上相同的.htaccess文件。我的初始化文件,包括我的所有模型,是动态编写的,以找出确切的系统文件路径,并相应地更新网站,这样我就可以在任何地方上传整个网站。

问题出在配置文件中。根据我是在开发还是在生产,我连接到一个不同的数据库。因此,我首先要做一个小检查,看看我是否在运行本地服务器。我将dev的命名约定存储在一个数组中,并在数组中循环查看HTTP_HOST是否与值匹配。

示例:

$dev_names = array('localhost','.dev');

然而,当我前几天在聊天中提到这一点时,一位受人尊敬的用户告诉我,他从来没有这样做过。相反,他有2个配置文件,并在正确的时间包含正确的配置文件?我不明白我的方法出了什么问题?

你能向我指出我的计划中的缺陷吗?以帮助我了解专家们?

(PS。作为奖励,你可以让我快速了解一下引导程序是如何工作的,听说这个词到处都是,不确定它是用PHP还是其他什么写的。)

我认为你的方法没有任何错误,我想不出有什么好的理由不这么做。

就我个人而言,这是在我的php文件中完成的;

 if ($_SERVER['SERVER_NAME'] == 'localhost')
 {
    define('ENVIRONMENT', 'development');
 }
 else
 {
    define('ENVIRONMENT', 'production');
 }

然后我所有的配置都挂断了。工作非常好-意味着当我在Dev&生产

我怀疑他想说的是,你试图让你的网站变得可移植,但事实上并没有那么可移植。如果将其移动到新服务器,则必须编辑配置文件。

特别是,当您将配置文件检查到某种版本控制系统中时,这会成为一个问题,并会影响其他人。理想情况下,你会使用这样的东西:

<?php // global config file which is checked into VCS
    $SETTING = "FOO";
    @include "config/local_settings.php"; // overrides go here
 ?>

您将所有本地设置覆盖放在本地文件中,而不将其提交给VCS。然而,提交类似local_settings_example.php的东西是非常常见的,以提醒其他用户他们需要定制什么。如果你觉得慷慨,你可以用评论的例子来填充它。

我只能在我喜欢的设置上投入2美分。主要是为了避免不希望的版本控制覆盖或冲突。在我看来,应该由服务器来决定它是生产服务器还是开发服务器,而不是脚本中应该更改的变量。像下面的例子这样的方法甚至可以在完全不同的开发设置中为个人设置一个环境。

通过设置变量启动

$_SERVER['SERVER_ADMIN'];

以检查生产或开发环境。本地到您自己的名字,并使用像@dev.elop.loc这样的虚拟域(例如。dbf@dev.elop.loc)那将永远不会真实存在。类似的函数

// environment development check
function __env_dev($check) {
  return substr($_SERVER['SERVER_ADMIN'], -(strlen($check))) === $check; 
}
// false = production
// true = development
__env_dev("@dev.elop.loc");

可以确定环境。根据我的经验,生产服务器总是有一个SERVER_ADMIN变量集(如果没有,它们真的应该,即使它必须是默认的you@example.com)到真实地址,避免默认you@example.com.如果对实时服务器的支持是在您自己的服务/维护中,那么将其更改为真实地址以将其与开发服务器区分开来也没什么大不了的;)