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

13

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

我们的应用程序同时使用Zend Framework和Doctrine。该应用程序将部署到不同的服务器上,每台服务器都有不同的配置文件。这些机器都是Windows和Linux(但都有Apache和php 5.2+)。

源代码存储在一个子版本库中,我们希望在Linux服务器上构建和存储软件包。

最好的情况是更新过程就像在应用程序目录中运行更新命令一样容易,其中更新命令还会更新数据库(使用Doctrine脚本)并确保框架的依赖项。这个更新命令必须是机器上的命令(我们无法ssh进入它们)。最好我们可以选择下载新版本或提供已下载的tarball与新版本。(但只下载或只提供tarball也可以)

安装包和更新(新版本)也最好由单个命令构建。

我读了一些phar、pear、phing的相关内容,但不知道哪种方法最好。连续集成服务器并不是真正必要的,但我考虑在构建版本后自动部署测试环境。

最初只需要非常容易地更新php应用程序,手动填写初始配置文件即可完成安装。

6个回答

3
我会从将各个服务器的应用程序根目录设为SVN工作副本开始。您可以添加mod_rewrite(或IIS的IIRF ASAPI过滤器)规则,以确保人们无法直接访问您的.svn目录。
然后,更新到最新源代码只需进行SVN更新即可。对于数据库更新需求,我也会在SVN中维护数据库修改脚本。您可能需要将SVN更新包装在批处理/ shell脚本中,以便在下载脚本后执行数据库更新。
对于现场服务器的变更管理,我还会将其工作副本设置为发布分支而不是主干。当您准备好发布时,可以将主干合并到发布分支中。这将使您能够测试部署并确保它很稳定,然后再在现场服务器上执行。它还有一个很好的副作用,即为您提供了一个漂亮的网站发布版本的副本,以防需要在发布后跟踪问题。
最后,根据这些更新的强度和时间,您可能还希望让您的更新脚本翻转“正在维护”的开关,以便用户暂时看到适当的消息而不是损坏的网站。

2

1
这个过程,或者至少是这篇文章,对我来说似乎过于复杂了。我没有看到清晰的解释他试图达成什么目标。 - rick

1

我已经成功地将Subversion用作部署工具。

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

这使得回滚和备份变得轻而易举。只需记住删除任何.svn目录的访问权限即可。


1

无论如何,我会使用phing或类似的工具来管理您的构建。让它运行您的测试,生成文档,构建和发布您的软件包/ tarball。

至于分发,您可以运行自己的PEAR服务器。原因是您希望用户拉取更新,您有Windows和Linux用户,并且您希望为他们处理依赖项。PEAR应该能够通过一个命令处理所有这些问题。

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

一定要提供一个简单的方法回滚到以前的版本。对于代码/配置,您只需保留副本。对于数据库,请使用迁移(听起来您已经在这样做了)。


0

你说你有一个集群。我们处于同样的位置,我们使用ZF和Doctrine。这是我们解决问题的方法:

<?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>

这远非理想,但对我们来说运行良好。希望能有所帮助。

链接:

Apache Ant

LiquiBase

如果您有任何问题,请告诉我,以便我更新答案。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接