【问题标题】:Prevent file differences between live and staging websites AND system scripts (PHP)防止实时网站和登台网站与系统脚本 (PHP) 之间的文件差异
【发布时间】:2010-12-17 19:24:12
【问题描述】:

我正在尝试找到一种维护开发环境和实际环境之间 PHP 配置差异的好方法。我知道在 Apache 运行脚本时如何处理差异(见下文),但在 在命令行上运行时不知道,例如通过 cron。

背景信息:

我所说的“配置差异”是什么意思? 像大多数代码商店一样,我们运行我们网站的非公开“登台”版本,之前我们会在其中测试代码它进入实时网站。我们使用 Subversion 并将实时网站作为“Trunk”,将“Staging”作为分支。如果文件的存储库版本差异很小,那么当代码从暂存到上线时,它会让生活更轻松。但显然,有些细节需要有所不同,例如数据库连接详细信息。

如何使用 Apache 解决配置差异

在 PHP 中,我们设置分支特定变量如下:

switch ($_SERVER['HTTP_HOST']) {
    case 'ourstagingurl.com':
        $dbPassword = "blahblah";
        break;
    default:
        $dbPassword = "blahblah";
}

或者我们将以下内容放在与特定站点相关的 .htaccess 文件中:

php_value dbPassword "blahblah"

为什么我无法使用 CLI 解决配置差异?

当脚本在 CLI 上运行时,没有像 $_SERVER 这样的超级全局变量。我可以include 使用绝对路径的配置文件,但我怎么知道脚本是来自实时还是暂存?我可以传入一个指定环境的命令行参数,但我希望有更好的方法?

【问题讨论】:

  • 只是一个不知从何而来的建议:让每个实时版本驻留在标签中怎么样?这样,您始终可以模拟以前的现场版本并将主干用作舞台。如果您愿意,请忽略此 OT 评论 :)

标签: apache configuration development-environment php


【解决方案1】:

您好,我在一家具有类似设置的公司工作。我通常做的是设置一个场景,其中登台和实时服务器都修改一个通用和通用的配置文件。当站点同时部署在舞台和现场时,信息将不正确,需要在每个位置修改一次。但是,这只需要发生一次,因为您修改的部分将被标记为被 subversion 修改,并且不会在后续的 svn 更新中被 subversion 覆盖。

【讨论】:

  • 谢谢 - 但是如何在脚本中包含配置文件而不引入实时代码和暂存代码之间的差异?
  • 这可能是我对这个问题的理解不够好,但似乎这个想法是不要用服务器特定的配置污染你的存储库代码。您会注意到很多应用程序通过 config.php.dist 具有示例或空白配置内容来解决此问题。然后安装程序将 config.php.dist 复制到 config.php 并将真实数据放入其中。显然,这只会发生一次。它有点不同于我认为你所追求的范式,但我认为它是有效的。
  • @Jurassic_C - 谢谢,config.php.dist -> config.php 提示对于部署很有用。但我的问题是如何在由 Apache 和没有 Apache 运行的 PHP 脚本中引用 config.php 文件。将dirname(__FILE__)$_SERVER['DOCUMENT_ROOT'] 结合使用使我能够解决我的问题。
【解决方案2】:
$host = isset( $_SERVER['HTTP_HOST'] ) ? $SERVER_['HTTP_HOST'] : php_uname('n');

switch ( $host ) 
{
    case 'ourstagingurl.com':
        $dbPassword = "blahblah";
        break;
    default:
        $dbPassword = "blahblah";
}

如果 php 版本 => 5.3,则可以使用 gethostname() 代替。

【讨论】:

  • 谢谢 - php_uname() 是一个我不知道的好技巧。我做了一个快速测试 (php -r 'echo gethostname()."\n";'),发现因为我们的 live 和 staging 在同一台机器上运行,它不会解决问题:-(
【解决方案3】:

如果 live 和 staging 是同一台服务器(为什么不使用虚拟化?),那么您可能不得不求助于将参数传递给您的脚本,即。调用 php script.php staging 进行登台,调用 php script.php live 进行实时站点。顺便说一句,如果您不知道,可以在 PHP 脚本中使用 $argv 访问参数 -> http://www.php.net/manual/en/reserved.variables.argv.php

虽然也许您可以获取文件路径的一部分并将其用作您的“环境”。 IE。当文件布局是 /project/staging/script.php 用于 staging 和 /project/live/script.php 用于 live 时,应该很容易使用 dirname(__FILE __) 从脚本本身获取环境 - FILE 后的额外空间需要被删除 - 并从中剥离 /project 文件夹。非常愚蠢,但它会起作用:p。

【讨论】:

  • 谢谢 - 结合使用 dirname(__FILE__)$_SERVER['DOCUMENT_ROOT'] 使我能够解决我的问题。
【解决方案4】:

你可以按照侏罗纪的建议去做,也可以设置一个环境变量,通过$_ENV读入。

【讨论】:

  • 谢谢 - 但不幸的是,这不起作用,因为目前实时代码和暂存代码位于同一台服务器上,因此它们将共享相同的环境变量。
  • @tom 你可以在运行命令之前设置环境,或者你可以作为两个不同的用户运行它?
【解决方案5】:

在我的一些应用程序中,我尝试包含一个仅用于覆盖开发服务器上的值的文件。我使用可怕的 @ 运算符,但你也可以使用 is_file()。

@include 'includes/debug.php';

debug.php 会尝试设置一些变量:

define('DEBUG', true);
define('DB_PASSWORD', 'foobar');

我告诉 svn 忽略这个文件。它存在于我的开发结帐中,对生产的影响很小。

更一般地说,我使用主机名检查,因为它在 CLI 和 Web 应用程序中都有效,但你已经声明你在同一个盒子上有两个分支,所以它已经过时了。

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2012-12-14
    • 2012-03-05
    相关资源
    最近更新 更多