代码之家  ›  专栏  ›  技术社区  ›  Tom

防止实时网站和临时网站以及系统脚本(PHP)之间的文件差异

  •  1
  • Tom  · 技术社区  · 15 年前

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

    背景信息:

    “配置差异”是什么意思? 和大多数代码商店一样,我们运行一个非公共的“登台”版本的网站,在该版本中,我们在代码进入实时网站之前对其进行测试。我们使用Subversion,并将实时网站作为“主干”,将“登台”作为分支。如果文件的存储库版本存在最小的差异,那么当代码从临时版本变为实时版本时,它会使生活更容易。但显然,有些细节需要有所不同,例如,DB连接细节。

    如何用Apache解决配置差异

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

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

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

    php_value dbPassword "blahblah"
    

    为什么我不能使用CLI解决配置差异?

    当在cli上运行脚本时,不存在诸如 $_SERVER . 我可以 include 一个使用绝对路径的配置文件,但我如何知道脚本是来自实时的还是临时的?我可以传递一个指定环境的命令行参数,但我希望有更好的方法?

    5 回复  |  直到 15 年前
        1
  •  1
  •   wimvds    15 年前

    如果活动服务器和临时服务器相同(为什么不使用虚拟化?)那么,您可能必须使用向脚本传递参数的方法,即调用 php script.php暂存 分期和 php script.php直播 现场现场。顺便说一句,如果您不知道,可以使用php脚本中的$argv来访问参数-> http://www.php.net/manual/en/reserved.variables.argv.php .

    不过,也许您可以获取文件路径的一部分,并将其用作您的“环境”。也就是说,当文件布局为/project/staging/script.php for staging和/project/live/script.php for live时,应该可以使用dirname(uu file_uuuuuuu)-需要删除文件后的额外空间-并将/project文件夹从中剥离。相当愚蠢,但它会起作用的:P。

        2
  •  2
  •   Jurassic_C    15 年前

    嘿,我在一家类似的公司工作。我通常要做的是设置一个场景,其中临时服务器和活动服务器都会修改一个通用配置文件和通用配置文件。当站点同时部署在临时站点和实时站点上时,信息将不正确,需要在每个位置修改一次。但是,这只需要发生一次,因为您修改的部件将被Subversion标记为已修改,并且在随后的SVN更新中不会被Subversion覆盖。

        3
  •  2
  •   David    15 年前
    $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()。

        4
  •  1
  •   troelskn    15 年前

    你可以按照侏罗纪的建议来做,或者你可以设置一个环境变量并把它读到 $_ENV .

        5
  •  1
  •   Annika Backstrom    15 年前

    在我的一些应用程序中,我试图包含一个只存在于重写开发服务器上的值的文件。我使用了可怕的@operator,但您也可以使用is_file()。

    @include 'includes/debug.php';
    

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

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

    我告诉SVN忽略这个文件。它一直在我的开发检查中,对生产的影响很小。

    更常见的是,我使用主机名检查,因为它在CLI和Web应用程序中都有效,但您已经声明在同一个框中有两个分支,所以这是不可用的。