【问题标题】:What is wrong with having a dynamic configuration file in PHP?在 PHP 中使用动态配置文件有什么问题?
【发布时间】:2012-09-09 11:28:49
【问题描述】:

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

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

例子:

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

但是,当我前几天在 Chat 中提到这一点时,a respected user told me 他从不这样做。相反,他有 2 个配置文件并在正确的时间包含正确的文件?我不明白我的方法有什么问题?

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

(PS。作为奖励,您可以快速了解一下引导程序的工作原理,听说这个词被扔了,不确定它是用 PHP 还是什么写的。)

【问题讨论】:

  • @Herbert 完美,正是我想要的!
  • 很高兴为您提供帮助。我给你的链接是本页右侧相关链接列表中的第一个。当您输入问题时,还要检查可能已经有答案的问题。它可能没有被列出,但它通常是一个很好的起点,有助于防止重复。

标签: php .htaccess configuration


【解决方案1】:

我看不出你的方法有什么问题,我想不出什么理由不这样做。

我个人在我的 php 文件中这样做;

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

然后我所有的配置都挂了。效果非常好 - 意味着我在开发和生产之间移动时配置更改几乎为零

【讨论】:

  • 但是当您使用虚拟主机并且您的本地站点被称为 mysite.dev 时会发生什么?
  • 所以只需将 $_SERVER['SERVER_NAME'] 字段更改为您喜欢的任何内容 - 即 $_SERVER['SERVER_NAME'] == 'mysite.dev'
  • 是的,所以我检查了结尾.dev。只是想确保我们在同一个波长上!
  • 这假定$_SERVER 是安全的并且不能被欺骗,这并不完全正确。
  • @YannisRizos 谁会欺骗你自己的本地服务器?
【解决方案2】:

我怀疑他的意思是您试图使您的网站可移植实际上并不是那么可移植。如果将其移动到新服务器,则必须编辑配置文件。

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

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

您将所有本地设置覆盖放在本地文件中,而不是将其提交给 VCS。不过,提交local_settings_example.php 之类的内容是很常见的,以便让其他用户提前了解他们需要定制的内容。如果您觉得大方,可以在其中添加注释示例。

【讨论】:

  • 如果我移动到新服务器,为什么我必须编辑我的配置文件?拥有两个配置文件有什么帮助
  • 此参数主要基于版本控制,这意味着您必须编辑任何用作索引的 *.php 才能更改存储库之外的 if 语句,这不像“便携”看起来。
【解决方案3】:

我只能在我喜欢的设置上投入 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。如果对实时服务器的支持是在您自己的服务/维护中,将其更改为真实地址以将其与开发服务器区分开来并没有什么大不了的;)

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2013-11-18
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多