如何正确部署PHP应用程序?

ocp*_*ime 22 php svn phing shell scripting

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

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

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

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

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

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

一种方法是使文件的生产版本只读(0444).这样,当我执行svn导出时,它们不会被文件的开发版本覆盖,我不必担心在从开发到生产的每个移动中编辑文件.但这是做持续整合等事情的坏方法.

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

最后一种方式是

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

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

} else {

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

}
Run Code Online (Sandbox Code Playgroud)

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

我不希望每次部署我的网站时都要做,我必须更改设置.

我的数据库架构不在版本控制中,所以db不是我的问题,只有settings.php和.htaccess.

另外我怎么能告诉svn不要更新某些目录,因为它也是特定于站点的(/ log,/ cache,/ assets,/ downloads).此外,我还需要为上述文件保留完整的apache(www_data)写访问权限.

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

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

这可能对许多想要在那里疯狂的应用程序开发人员有用.

提前致谢,

ocptime

Cod*_*eef 13

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

我没有在我的远程仓库中保存任何配置文件 - 当我在dev中签出时,我可以添加它们一次,然后忽略它们,所以我不会意外地检查它们.在部署时,我设置了cap deploy recipe,以便将设置文件写入已部署的版本.这样,我就不必担心部署和丢失任何关键的东西.

Cap还负责处理任何上传的资产(对目录进行符号化以使它们在每次部署时保持不变),并且它还会自动备份所有资产文件和部署到Amazon S3的数据库.很漂亮,嗯?


lo_*_*fye 8

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

一旦我告诉它环境,它会读入相应的.properties文件(即local.properties,production.properties等)

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

创建这些文件:

通用/建设/模板/ settings.tpl

define('H_PATH','##H_PATH##');
define('ENVIRONMENT', '##ENVIRONMENT##');
Run Code Online (Sandbox Code Playgroud)

建立/模板/ htaccess.tpl

http://##H_PATH##
Run Code Online (Sandbox Code Playgroud)

建立/属性/ local.properties

site.H_PATH = localmyapp.com
site.ENVIRONMENT = local
Run Code Online (Sandbox Code Playgroud)

建立/属性/ production.properties

site.H_PATH = myapp.com
site.ENVIRONMENT = production
Run Code Online (Sandbox Code Playgroud)

通用/编译/ 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>                               
Run Code Online (Sandbox Code Playgroud)

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

phing config
Run Code Online (Sandbox Code Playgroud)

然后输入:

local
Run Code Online (Sandbox Code Playgroud)

并按回车键.而已!这样做的一个巨大好处是您不再需要代码中的任何if/else语句.另外,它不依赖于$ _SERVER变量,所以它在命令行上运行良好.