你首选的PHP部署策略是什么?

我正在开始一个新的PHP项目,我很想从其他开发者那里得到一些关于PHP部署首选策略的反馈。 我喜欢自动化一些事情,以便一旦发生变化,他们可以快速迁移到开发或生产服务器。

我有使用Capistrano与Ruby的部署经验以及一些基本的shell脚本。

在我首先自己动手之前,听听其他人如何在他们的项目中接触到这一点,真是太好了。

更多信息

目前,开发人员在本地安装站点,并将更改提交到Subversion存储库。 最初的部署是通过从svn导出一个标签发行版并将其上传到服务器来完成的。

通常通过手动上传更改的文件来进行额外的更改。

对于PHP来说,使用Phing构build脚本的SVN是最好的select。 Phing类似于ANT,但是用PHP编写,这使得PHP开发人员更容易修改其需求。

我们的部署例程如下:

  • 每个人都在同一台本地服务器上工作,每个开发人员也都在他家的机器上签到。
  • 提交会触发一个post-commit钩子来更新登台服务器。
  • testing在分段服务器上运行,如果他们通过 – 继续。
  • Phing构build脚本运行:
  • closures生产服务器,将域切换到“正在build设中”页面
  • 在生产结帐时运行SVN更新
  • 运行模式变化脚本
  • 运行testing
  • 如果testing失败 – 运行回滚脚本
  • 如果testing通过,服务器路由回生产结帐

还有一个连续集成服务器phpUnderControl 。 我并没有觉得它对于web项目来说是非常有用的。

我目前正在使用Git部署PHP。 使用Git的最新副本来更新我的生产服务器所需要的只是一个简单的git push生产。 这很容易和快捷,因为Git足够聪明,只发送差异,而不是重新整个项目。 它还有助于在我的一端出现硬件故障的情况下保留Web服务器上的存储库冗余副本(尽pipe我也推送到GitHub以保证安全)。

我们使用Webistrano作为Capistrano的网页前台,对此非常满意。

Webistrano允许从SVN,GIT等多阶段,多环境的部署。 它具有内置的回滚支持,支持单独的服务器angular色,如Web,数据库,应用程序等,并行部署。 它允许您覆盖多个级别上的configuration参数,例如每个阶段,并logging每个部署的结果,可以select邮寄。

尽pipeCapistrano和Webistrano是Ruby应用程序,但部署“配方”的语法非常简单且function强大,足以让任何PHP程序员都能理解。 最初Capistrano是为Ruby on Rails项目而构build的,但是很容易适应PHP项目。

configuration完成后,非编程人员(例如部署暂存版本的testing人员)就可以使用它。

为了提供最快速的部署,我们安装了fast_remote_cache方法,该方法更新远程服务器上的svn工作副本caching,然后硬连接结果。

我使用Apache Ant部署到不同的目标(开发,质量保证和现场)。 Ant是为Java部署而devise的,但它为部署任意文件提供了非常有用的一般情况解决scheme。

build.xml文件的语法很容易学,你可以定义在命令行调用ant程序时运行的不同目标及其依赖关系。

例如,我有dev,QA和live的目标,每个目标都依赖于CVS服务器的CVS目标,它会从我们的CVS服务器中检出最新的头部修订版本,将相应的文件复制到构build目录(使用fileset标签),然后将生成目录rsyncs到相应的服务器。 学习有一些怪癖,学习曲线并不完全平坦,但我已经这样做了多年,没有麻烦,所以我build议你的情况,虽然我很好奇其他答案我会在这个线程上看到。

我用Git手动做东西。 一个开发仓库,将git push --mirror编辑成公共仓库,而现场服务器是第三个仓库。 这部分我想是和你自己的设置一样的。

最大的区别是,我使用分支几乎每一个变化我正在工作(我现在有5左右),并倾向于在他们之间来回翻转。 除了合并其他分支之外,主分支不会被直接更改。

我直接从主分支运行直播服务器,当我完成另一个分支并准备合并它时,将服务器翻转到该分支一段时间。 如果中断,把它放回主人需要几秒钟。 如果它工作,它将被合并到主,现场代码被更新。 我想SVN中的一个类比将有两个工作副本,并通过符号链接指向活动的副本。

我知道Phing现在已经被提及了几次,但是我对phpUnderControl有很大的好运。 对于我们我们

  1. 检查分支机构的个人副本到本地机器
  2. 分支进行testing,然后合并到Trunk中
  3. 提交Trunk由phpUnderControl自动构build,运行testing并构build所有文档,应用数据库变化
  4. 树干通过质量testing运行,然后合并到我们的Stable分支
  5. 再次,phpUnderControl自动生成稳定,运行testing,并生成文档和更新数据库
  6. 当我们准备推送到生产环境时,我们运行一个rsync脚本来备份生产,更新数据库,然后推送文件。 rsync命令是手动调用的,以便确保有人在观看升级。

自制部署脚本的替代scheme是部署到平台即服务,为您抽取大量的工作。 PaaS通常会提供自己的代码部署工具,以及扩展,容错(例如,在硬件故障时不会停机),并且通常是用于监视,日志检查等的优秀工具包。还有部署到已知的良好configuration将随着时间的推移而保持最新(对您来说更令人头痛)。

我build议的PaaS是dotCloud ,除了PHP( 请参阅他们的PHP快速入门 ),它还可以部署MySQL,MongoDB和一大堆附加服务。 它还具有很好的function,如零宕机部署,即时回滚,全面支持SSL和websocket等。还有一个免费的层次总是很好:)

我在那里工作当然有点偏颇! 除了dotCloud之外,还有其他值得一试的选项是Pagodabox和Orchestra(现在是Engine Yard的一部分)。

希望这可以帮助!

所罗门

你自动而盲目地从存储库到生产服务器的变化听起来很危险。 如果您提交的代码包含回归错误,那么您的生产应用程序会出现问题呢?

但是,如果你想要一个持续集成PHP的系统,我猜Phing是PHP的最佳select。 我自己没有testing过,因为我做了一些手动的例如scp。

我晚了,但我想我会分享我们的方法。 我们使用Phing和Phingistrano ,通过预build的构build文件为Phing提供类似Capistrano的function。 这是非常酷的,但只有当你使用Git时才有效。

我有一个在服务器上的SVN发行分支的工作副本。 更新站点(当没有模式更改时)与发出SVN更新命令一样简单。 我甚至不必把网站离线。

Phing可能是你最好的select,如果你能忍受xmlconfiguration文件的痛苦。 Symfony框架有它自己的rake(pake)端口,它工作得很好,但是与Symfony的其余部分(尽pipe你可能会把它们分开)相互紧密耦合。

另一个select是使用Capistrano。 很明显,它不像PHP那样和Ruby一样,但是你仍然可以用它来做很多事情。

最后,你总是可以编写shell脚本。 到目前为止,这就是我所做的。

http://controltier.org/wiki/Main_Page

我们将使用它来进行多服务器部署和维护。

一年迟到,但在我的情况下,部署不是自动的。 我发现部署代码和自动运行数据库迁移脚本是很危险的。

相反,Subversion挂钩只用于部署到testing/临时服务器。 代码在迭代结束时被部署到生产环境,在运行testing之后,确保事情能够正常工作。 对于部署本身,我使用一个使用rsync传输文件的定制Makefile。 Makefile也可以在远程服务器上运行迁移脚本,暂停/恢复Web和数据库服务器。

在我的工作中,我和我的团队已经为Capistrano的部署开发了一个Phing导向的替代品,并且还包含了像PHPUnittesting,phpcs和PHPDocumentor等phing中可用的一些好东西。 我们已经把它作为一个git回购,可以添加到一个项目作为一个子模块在git中,它工作得很好。 我已经将它附加到了一些项目中,并且它的模块化程度足以让它适用于我们几个环境(分段,testing,生产等)中的任何项目。

使用phing构build脚本,您可以手动从命令行运行它们,而且我也成功地使用Hudson和Jenkins ci实现了构build/部署例程的自动化。

我现在不能发布任何链接,因为回购还没有公开,但是我被告知我们有时会很快开放它,所以如果您有兴趣,或者如果您有兴趣,请随时与我联系。有关使用phing和git自动部署的任何问题。

我猜SVN的部署方式不是很好。 因为:

你需要打开全世界的SVN访问

在生产Web服务器中有许多.svn

我认为Phing产生一个分支+结合所有的js / css +replace阶段config + ssh上传到所有www服务器是更好的方法。

ssh到10个www服务器和svn起来也是麻烦的。