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

160

我正在开始一个新的PHP项目,我希望得到其他开发者对他们首选的PHP部署策略的反馈。我希望能够自动化一些东西,以便一旦提交更改,它们就可以快速迁移到开发或生产服务器。

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

在我自己深入之前,听听其他人如何在他们的项目中处理这个问题会很好。

更多信息

目前,开发人员在站点的本地安装上工作,并将更改提交到子版本库。最初的部署是通过从svn导出带有标签的版本并上传到服务器来完成的。

通常通过手动上传更改后的文件来进行逐步的其他更改。


可爱 :) 感谢 splattne 的编辑。 - GloryFish
1
@Paul Tomblin:天啊,我停不下来笑了!!!没有比这更好的方式了 :) - Andrei Rînea
有人可以回答这个问题吗 - http://stackoverflow.com/questions/36034277/what-are-pros-and-cons-of-having-production-server-as-git-working-directory - Sandeepan Nath
15个回答

109

对于PHP开发,使用带有Phing构建脚本的SVN是可行的。Phing类似于ANT,但它是用PHP编写的,这使得PHP开发人员更容易根据自己的需求进行修改。

我们的部署流程如下:

  • 每个人都在同一台本地服务器上开发,每个开发人员也在自己的机器上进行代码版本控制。
  • 提交代码后会触发一个post-commit hook来更新预发布服务器。
  • 在预发布服务器上运行测试,如果测试通过,则继续。
  • 运行Phing构建脚本:
  • 将生产服务器停止,将域名切换到“正在建设中”的页面
  • 在生产环境中运行SVN更新
  • 运行模式变化脚本(schema deltas script)
  • 运行测试
  • 如果测试失败,则运行回滚脚本
  • 如果测试通过,则将服务器路由回生产环境

还有phpUnderControl,它是一个持续集成服务器。但对于Web项目,我认为它不是很有用。


36
为什么要放置“网站正在维护”的屏幕?如果您运行一个 releases/ 目录,并通过符号链接将 liveSite/ 指向 releases/ 文件夹中的您的文件夹,则可以将整个站点完全检出到新的 releases/ 文件夹中,并在 co 完成后立即翻转符号链接?无需停机时间(除非在符号链接切换期间发出请求)。 - Joseph Lust
@EranGalperin 有点不相关的问题:您是自己编写模式增量脚本还是使用了一些开放库? - Artem Goutsoul
2
谁负责执行所有这些任务,例如在生产环境上更新SVN并创建新版本的符号链接?是Phing吗?还是Jenkins? - Daniel Ribeiro
@EranGalperin,如果在您更新了生产环境控制台后测试失败,您如何回滚更改? - blacktie24
服务器的宕机时间似乎过高且不必要。 - Sreeraj
显示剩余3条评论

24

我正在使用Git部署PHP代码 (参考)。只需要简单地执行 git push production 命令,就能更新我的生产服务器上的最新代码,而且速度非常快,因为Git聪明地只发送差异部分而不是整个项目。此外,它还有助于在我这边出现硬件故障的情况下,在Web服务器上保留一份冗余副本 (尽管我也会将代码推送到GitHub以保险起见)。


3
你如何使用这种方法处理数据库? - 32423hjh32423
1
@neilc 很遗憾,需要手动操作。在推送之前,必须手动执行任何对数据库的更改。 - Kyle Cronin
我通常使用include()函数引入一个包含数据库配置的PHP文件,并手动将该文件放置在服务器或测试机器上。这样,您就不会将密码存储在git中,也不会意外地操作生产数据库。 - Matt
@SandeepanNath 抱歉,我不知道关于phing的任何信息。 - Kyle Cronin
你如何处理git不存储文件权限的问题?https://dev59.com/Emgu5IYBdhLWcg3wkH6P - Adam
显示剩余2条评论

14
我们使用 Webistrano,这是Capistrano的一个Web前端,我们非常满意。
Webistrano允许从SVN、GIT和其他源进行多阶段、多环境部署。它具有内置回滚支持,支持单独的服务器角色,如web、db、app等,并且可以并行部署。它允许您在多个级别上覆盖配置参数,例如每个阶段,并记录每次部署的结果,可选择通过邮件发送。
尽管Capistrano和Webistrano是Ruby应用程序,但部署“recipes”的语法对于任何PHP程序员来说都很容易和强大。最初Capistrano是为Ruby on Rails项目构建的,但很容易适应PHP项目。
一旦配置好,即使是非程序员,如测试人员也可以轻松使用它部署分期版本。
为了提供最快的部署速度,我们安装了fast_remote_cache方法,在远程服务器上更新svn工作副本缓存,然后进行硬链接。

6

我使用Apache Ant来部署至不同的目标(开发、QA和生产环境)。Ant专为Java部署而设计,但它提供了一个非常有用的通用解决方案,可以部署任意文件。

build.xml文件的语法非常容易学习 - 您可以定义不同的目标及其依赖项,当您在命令行上调用ant程序时,这些目标就会运行。

例如,我有开发、QA和生产环境的目标,每个目标都依赖于cvsbuild目标,该目标从我们的CVS服务器检出最新的head版本,使用fileset标记将适当的文件复制到构建目录中,然后将构建目录同步到适当的服务器。需要学习一些技巧,但学习曲线并不陡峭。我已经使用这种方式多年了,没有任何麻烦,因此我建议您采用这种方式。虽然我很好奇在这个话题上会看到其他哪些回答。


6
我手动使用Git来完成工作。一个用于开发的代码库,通过git push --mirror命令推送到公共代码库,而运行的服务是从第三个代码库中拉取的。这一部分我想应该与你的设置相同。
最大的不同在于,我将几乎每个正在处理的更改都放在分支上(我现在大约有五个分支),并且倾向于在它们之间来回切换。除了合并其他分支,主分支不直接进行修改。
我从主分支直接运行实时服务器,并且当我完成另一个分支并准备好合并它时,将服务器切换到该分支。如果出现问题,将其转回到主分支只需要几秒钟。如果它可以工作,那么就会被合并到主分支并更新现有的代码。我想,在SVN中类似的做法是拥有两个工作副本,并通过符号链接指向活动的副本。

3

我知道 Phing 已经被提到了几次,但是我使用 phpUnderControl 取得了很好的效果。我们的流程如下:

  1. 从分支处检出副本到本地机器上
  2. 测试分支,然后将其合并到主干
  3. 自动构建 phpUnderControl 对主干进行提交构建,运行测试和构建所有文档,应用数据库增量
  4. 对主干进行质量测试,然后将其合并到我们的稳定分支
  5. 再次,phpUnderControl 自动构建稳定版本,运行测试,并生成文档并更新数据库
  6. 当我们准备推送到生产环境时,我们运行一个 rsync 脚本,备份生产环境,更新数据库,然后推送文件。rsync 命令由手动调用,以确保有人在观察升级过程。

5
phpUnderControl已停止更新。 - m02ph3u5

3
一个替代自制部署脚本的选择是部署到平台即服务(PaaS),它为您抽象了很多工作。PaaS通常会提供自己的代码部署工具,以及扩展性、容错性(例如硬件故障时不会停机)和通常用于监控、日志检查等的工具包。还有一个好处是部署到已知的良好配置中,随着时间的推移,该配置将得到更新(为您减少了一个头疼的问题)。
我推荐的PaaS是dotCloud,除了PHP(请参阅其PHP快速入门)之外,它还可以部署MySQL、MongoDB和许多其他服务。它还有一些不错的好处,如零停机部署、即时回滚、完全支持SSL和websocket等。而且还有一个免费层,这总是很好的 :)
当然,我有点偏见,因为我在那里工作!除了dotCloud之外,值得检查的其他选项还有Pagodabox和Orchestra(现在是Engine Yard的一部分)。
希望这有所帮助!
所罗门

2
我迟到了,但是我想分享我们的方法。我们使用Phing和Phingistrano,它通过预构建的构建文件为Phing提供了类似于Capistrano的功能。这非常酷,但目前仅适用于使用Git的情况。

1
在我的工作中,我和我的团队开发了一个基于Phing的替代Capistrano部署的工具,并且还整合了一些Phing中可用的好东西,如PHPUnit测试、phpcs和PHPDocumentor。我们将其制作成了一个Git仓库,可以作为子模块添加到任何项目中,并且它的表现非常出色。我已经将它附加到了几个项目上,而且它足够模块化,可以轻松地使其与任何环境(staging、testing、production等)上的任何项目配合使用。
通过Phing构建脚本,您可以手动从命令行运行它们,我也成功地使用Hudson和现在的Jenkins ci自动化了构建/部署例程。
由于该仓库尚未公开,因此我无法发布任何链接,但是我被告知我们很快会开源它,因此如果您对使用Phing和Git自动化部署有兴趣或有任何问题,请随时与我联系。

1

从代码库自动盲目地将更改应用到生产服务器听起来很危险。如果您提交的代码包含回归错误,那么您的生产应用程序可能会出现故障。

但是,如果您想要一个适用于PHP的持续集成系统,我想Phing是最好的选择。虽然我自己没有测试过它,但我通常会手动操作,例如使用scp。


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