如何为php应用程序进行部署

如何为php应用程序进行部署,php,deployment,dependency-management,Php,Deployment,Dependency Management,我目前正在为一个慈善组织开发一个php应用程序,我现在正处于定义部署实践的阶段 我们的应用程序同时使用Zend框架和学说。该应用程序将部署到不同的服务器,每个服务器都有不同的配置文件。这些机器都是Windows和Linux(但都使用Apache和PHP5.2+) 源代码位于subversion存储库中,我们希望在Linux服务器上构建和存储我们的包 我们更希望更新过程像在应用程序目录中运行update命令一样简单,其中update命令还更新数据库(使用条令脚本),并确保框架的依赖性。这个更新命令

我目前正在为一个慈善组织开发一个php应用程序,我现在正处于定义部署实践的阶段

我们的应用程序同时使用Zend框架和学说。该应用程序将部署到不同的服务器,每个服务器都有不同的配置文件。这些机器都是Windows和Linux(但都使用Apache和PHP5.2+)

源代码位于subversion存储库中,我们希望在Linux服务器上构建和存储我们的包

我们更希望更新过程像在应用程序目录中运行update命令一样简单,其中update命令还更新数据库(使用条令脚本),并确保框架的依赖性。这个更新命令必须是机器上的一个命令(我们不能ssh到它们中)。最好我们可以选择下载一个新版本,或者提供一个已经下载的tarball和一个新版本。(但仅下载或仅tarball也可以)

带有安装和更新(新版本)的包最好也通过单个命令构建

我一直在读一些关于法尔、皮尔、芬的书,但我不知道最好的方法是什么。持续集成服务器并不是真正必要的,但我考虑在构建版本后自动部署测试环境


最初,只有php应用程序的更新必须非常简单,安装时最初填写一个配置文件可以手动完成。

您说过您有一个碎纸机。我们处于相同的位置,我们使用ZF和条令。我们就是这样解决问题的:

<?xml version="1.0" encoding="UTF-8"?>
<project name="yourprojectname" basedir=".">

<target name="deploy" depends="apply-deltas,update-app01,update-app02">

</target>

<target name="update-app01">

  <sshexec host="app01"
    username="yourusername"
    password="yourpassword"
    trust="true"
    command="cd path/to/root/directory &amp;&amp;
      svn update &amp;&amp;
      php cmd/clear_cache.php
      "/>

</target>

<target name="update-app02">

  <sshexec host="app02"
      username="yourusername"
      password="yourpassword"
      trust="true"
      command="cd path/to/root/directory &amp;&amp;
      svn update &amp;&amp;
      php cmd/clear_cache.php
      "/>

</target>

  <target name="apply-deltas" depends="liquibase-prepare">
     <updateDatabase
          changeLogFile="${db.changelog.file}"
          driver="${database.driver}"
          url="${database.url}"
          username="${database.username}"
          password="${database.password}"
          promptOnNonLocalDatabase="${prompt.user.if.not.local.database}"
          dropFirst="false"
          classpathref="classpath" >
          <changeLogProperty name="table.name" value="ant_param_table"/>
     </updateDatabase>
  </target>


<target name="liquibase-prepare">
    <path id="classpath">
    <fileset dir="${basedir}/libNoPackage">
        <include name="**/*.jar" />
    </fileset>
    </path>

    <taskdef resource="liquibasetasks.properties">
        <classpath refid="classpath"/>
    </taskdef>
  </target>

</project>

这远非理想,但对我们来说效果很好。希望有帮助

链接:


如果您有一些问题,请告诉我,以便我可以更新答案。t

也许有时候更简单的方法效果最好。如果您在svn repo中简单地标记了稳定版本,那么您可以编写一个批处理/bash脚本来下载最新版本,同时备份到旧版本,而无需用户干预-您还可以以这种方式运行所需的任何脚本。另一种选择是用PHP编写一个简单的接口,但这取决于它需要有多简单。

我首先将各种服务器的应用程序根作为SVN工作副本。您可以添加mod_rewrite(或IIRF ASAPI filters for IIS)规则,以确保人们无法直接寻址您的.svn目录

然后,更新到最新的源代码可以像SVN更新一样简单。为了满足您的数据库更新需求,我还将在SVN中维护数据库修改脚本。您可能需要将SVN更新包装在批处理/shell脚本中,以便在下载脚本后执行数据库更新

对于实时服务器上的变更管理,我还需要它们的工作副本,不是主干,而是发布分支。准备发布时,可以将主干合并到发布分支中。这将允许您在实时服务器上执行部署之前测试部署并确保它是可靠的。它还有一个很好的副作用,即为您提供站点发布版本的一个很好的副本,以防您需要跟踪发布后的问题


最后,根据这些更新的强度和时间,您可能还希望让您的更新脚本翻转“正在维护”开关,以便用户临时收到正确的消息,而不是损坏的站点

本杰明·埃伯莱(Benjamin Eberlei)几周前发布了一篇博客,标题为。他描述了部署PHP应用程序的一个非常有趣和优雅的过程。

我使用subversion作为部署工具,效果非常好

在所有生产服务器上使用svn更新,或使用phing。(甚至可以使用phing来更新svn。)


使回滚和备份成为一个快照。请记住删除对任何.svn目录的访问。

无论哪种方式,我都会使用phing或类似的工具来管理您的构建。让它运行您的测试、生成文档、构建和发布您的包/tarball

至于分销,你可以。理由是你说你希望用户拉更新,你有Windows和Linux用户,你想处理他们的依赖关系。PEAR应该能够用一个命令处理所有这些

这就是说,我会选择最简单的方法,适合您的用户。这可能只是一个通过HTTP和一个小型PHP升级脚本(或phing目标)提供的tarball


一定要提供一种简单的方法来回滚到以前的版本。使用代码/配置,您只需保留一份副本即可。对于DB,使用迁移(听起来你已经在这么做了。)

这个过程,或者至少是这篇文章,对我来说太复杂了。我看不出他想要完成什么的明确解释。