【问题标题】:How To Deploy Your PHP Applications Correctly?如何正确部署您的 PHP 应用程序?
【发布时间】:2010-11-11 16:54:53
【问题描述】:

如何正确地将应用程序从开发部署到生产以及如何处理多个站点配置。 我所有的开发都是通过位于 var/svn/myapp/trunk 和 实际的生产代码在 /var/www/myapp 中。

我将最新的代码签出到我的本地计算机到一个名为“myapp_latest_svn”的目录中。 我的主要 settings.php 中有特定于站点和位置的代码,其中 H_PATH = 'http://myapp.com' & db_host、db_user_name 和 db_password 的 db 配置设置,如您所知 本地机器设置(其中 localhost/myapp.com 只是一个 Apache 别名)和生产服务器(实时站点在 myapp.com 上运行)。

此外,.htaccess 文件与生产服务器上的文件不同。简而言之,开发和生产之间存在许多差异。

我将所有工作都保存在 SVN 中。每天早上我都会使用 SVN Update,它将最新的代码更新到我的本地 svn 存储库。 当我准备好上线时,我使用 svn Commit 构建一个版本。

然后在发布中,我必须记住将所有适当的开发文件更改为它们的生产对应文件。 现在我必须手动编辑生产 settings.php 和 .htaccess 以反映站点特定的更改。

我正在寻找一种从开发到生产完成版本控制和 没有手动编辑容易出错和不好的做法的文件。

一种方法是将文件的生产版本设为只读 (0444)。这样当我进行 svn 导出时, 它们不会被文件的开发版本覆盖,我不必担心在 从开发到生产的每一步。但这是做持续集成等事情的糟糕方式。

还可以制作多个 settings.php 副本(一个用于 localhost、beta 和 prod)。然后使用shell脚本 从svn导出,然后一旦导出完成,它用正确的settings.php替换settings.php, 取决于我们部署到的位置。这样,一切都是自动化的。 但这也是一种蹩脚的方式。

最后一个方法是

if( eregi ("myapp.com$", $_SERVER['HTTP_HOST']) ){

    define('H_PATH', 'myapp.com');

} else {

    define('H_PATH', 'localmyapp.com');

}

就 settings.php 而言,这很好。 但是 .htaccess 是什么,你不能像上面那样在 .htaccess 中检查。

我不希望每次部署站点时都必须更改设置。

我的 DB 架构不在版本控制中,所以 db 对我来说不是问题,只有 settings.php 和 .htaccess。

另外,我如何告诉 svn 不要更新某些目录,因为这也是特定于站点的(/log、/cache、/assets、/downloads)。 我还需要为上述文件保留 apache ( www_data) 的写访问权限。

最后我不想在导出时将空的主干目录和 .svn 文件复制到生产服务器。

在从 svn 构建到生产服务器时,如何使用 Phing 甚至 shell 脚本进行集成而不会导致任何这些问题。

这可能对许多想成为应用程序开发者的人有用。

提前致谢,

工作时间

【问题讨论】:

    标签: php svn shell scripting phing


    【解决方案1】:

    我建议您查看 Capistrano 以了解您的部署问题。我用它来部署 PHP 系统,它会完成你描述的所有事情(在你的部署配方中使用一些脚本)。

    我没有在我的远程仓库中保留任何配置文件 - 当我在 dev 中结帐时,我可以添加一次,然后忽略它们,这样我就不会意外地检查它们。在部署方面,我的 cap deploy 配方已设置,以便它将设置文件写入已部署的版本。这样一来,我就不必担心部署和遗漏任何关键的东西。

    Cap 还负责处理任何上传的资产(对目录进行符号链接,以便它们在每次部署时保持原位),它还会自动备份所有资产文件和部署到 Amazon S3 的数据库。很漂亮吧?

    【讨论】:

    • 您能解释一下符号链接资产目录的作用吗?
    【解决方案2】:

    我有一个名为 config 的 Phing 任务,它询问我想为哪个环境配置代码。该任务接受几个可能的值:本地、开发、登台、生产等。

    一旦我告诉它环境,它就会读入适当的 .properties 文件(即 local.properties、production.properties 等)

    下一步将是您的关键:存储配置文件和 htaccess 文件的模板,然后对它们运行 filterChain replaceTokens 任务,以便将它们的标记替换为属性文件中的值。

    创建这些文件:

    common/build/templates/settings.tpl

    define('H_PATH','##H_PATH##');
    define('ENVIRONMENT', '##ENVIRONMENT##');
    

    构建/模板/htaccess.tpl

    http://##H_PATH##
    

    构建/属性/local.properties

    site.H_PATH = localmyapp.com
    site.ENVIRONMENT = local
    

    build/properties/production.properties

    site.H_PATH = myapp.com
    site.ENVIRONMENT = production
    

    common/build/build.xml

    <target name="config">
       <input propertyname="env" validargs="local,production">Enter environment name:</input>
       <property file="build/properties/${environment}.properties" />
       <copy file="build/templates/settings.tpl" 
         tofile="config/settings.php" overwrite="true"> 
         <filterchain>
          <replacetokens begintoken="##" endtoken="##">       
              <token key="H_PATH" value="${site.H_PATH}" />
              <token key="ENVIRONMENT" value="${site.ENVIRONMENT}" />
          </replacetokens>          
         </filterchain>
       </copy>      
       <copy file="build/templates/htaccess.tpl" 
         tofile="public/.htaccess" overwrite="true">    
         <filterchain>
          <replacetokens begintoken="##" endtoken="##">       
              <token key="H_PATH" value="${site.H_PATH}" />                                                           
          </replacetokens>          
         </filterchain>
       </copy>              
       <echo msg="Configured settings.php and .htaccess for ${environment}" />              
    </target>                               
    

    现在,当您想要配置站点以在本地运行时,只需键入:

    phing config
    

    然后输入:

    local
    

    然后按回车键。而已! 这样做的一大好处是您的代码中不再需要任何 if/else 语句。另外,它不依赖于 $_SERVER 变量,所以它可以在命令行上正常工作。

    【讨论】:

      【解决方案3】:

      我用重命名的文件名将我的设置文件和 .haccess 存储在 SVN 中,例如settings.php.example 和 .htaccess.example。这样,当我创建一个新版本时,我就不必担心覆盖内容。

      【讨论】:

        【解决方案4】:

        您可以考虑 Capistrano、Magallanes、Deployer,但它们也是脚本。我可能会建议您尝试一下walle-web,这是一个用 PHP 编写的部署工具,开箱即用 yii2。我已经在我们公司托管了几个月,它在部署测试、模拟、生产环境时运行良好。

        它支持您配置预部署、部署后、发布后任务,然后您可以更改您的环境配置,例如cp db_test.php db.php

        它依赖于 bash 工具组、rsync、git、link,但一般来说 web ui 可以很好地操作,试试看:)

        【讨论】:

          猜你喜欢
          • 2022-10-18
          • 1970-01-01
          • 2017-06-04
          • 2018-12-19
          • 2011-10-15
          • 1970-01-01
          • 2019-09-30
          • 1970-01-01
          • 2021-06-20
          相关资源
          最近更新 更多