建立一个PHP Web项目,基础设施

14
如何最佳设置PHP(LAMP)开发环境,以便拥有开发、备份和生产服务器,可以一键部署到任何一个服务器,并且还可以一键回滚到任意版本。回滚时还应将数据库架构和数据回滚到此源代码为当前的状态。(除了数据库回滚功能)我已经使用shell脚本为一个应用完成了所有这些工作。现在我很想知道其他人的环境是如何设置的。同时,是否有通用的工具或最佳实践可供参考?
你是如何做到这一点的?您使用哪些现有工具? 谢谢!
更新:只是为了澄清因为有一些混淆关于我的兴趣是什么。
我真的希望人们介绍他们的环境是如何设置的。
如果您运行PHP项目并且将DB架构放在版本控制中,您是如何做到的?您使用哪些工具?它们是公司内部开发的还是我们都可以在网络上找到?
如果您在提交(和/或夜间)时对提交自动进行测试,您是如何做到的?您使用哪个源代码版本控制系统?您使用SVN并在提交后运行测试钩子吗?
如果您运行具有多个开发服务器、一个暂存服务器和生产服务器的PHP项目,您是如何组织它们以及如何部署的?
我希望能从中获得其他人如何将所有东西粘合在一起的好主意。

你的问题有误导性。CI更多地描述了QA方面的内容。例如单元测试、检查代码覆盖率、构建文档、检查编码风格、PMS等等。你真的在寻求部署方面的建议吗? - Till
我删除了持续集成,因为那不是你要求的内容。 - Till
5个回答

12

我们的生产环境包括以下内容:

  • 3个前端服务器为我们的网站提供服务
  • 2个数据库后端(主从复制)
  • 1个混合服务器运行广告服务器的httpd和数据库

我们的开发环境是一个单一的服务器,同时运行数据库和httpd。在配置方面,我们为每个人设置了不同的工作空间,并使用Subversion进行版本控制。Staging也很简单 - 它运行在其中一个前端上。

数据库更改

最初,我们花费了很多时间在数据库设计上,看起来这确实得到了很好的回报。在过去的五个月中,我们没有做任何重大的更改。我们部署的大多数更改都是在前端进行的。现在,到目前为止,我们手动运行所有对数据库的更改,并且我总是编写一个小脚本来还原。

如果我有更多这样的需求,我会在这里使用DoctrineMigrations。我实际上从未有机会在生产中使用它们,但我已经广泛地使用过它们,它们似乎非常强大。

部署

因此,每当我们部署新版本时,我们会创建一个代码标签,我们在Staging上检出该标签,然后进行一些检查列表等操作,然后在生产前端部署代码。为了执行所有的部署工作,我在Capistrano中设置了几个任务。

请查看此示例capfile

role :www, "web01", "web02", "web03"
role :web, "web01", "web02", "web03", "web04"
role :db, "db01", "db02"

desc "Deploy sites"
task :deploy, :roles => :www do
    run "cd /usr/www/website && sudo svn --username=deploy --password=foo update"
end

Capistrano还允许您在不定义任务的情况下运行任何其他命令:

cap invoke COMMAND="uptime" ROLES=web

(需要设置“web”角色。请参见上面的示例。)

编码风格和文档

我们基本上遵循 PEAR 编码标准,并使用 PHP_CodeSniffer (phpcs) 进行检查。当我说基本上时,我的意思是我分叉了提供的嗅探器,并添加了一些我自己喜欢的例外。

除了编码风格,phpcs 还会检查内联文档。这个文档最终是由 phpDocumentor 创建的。

CI

我们在 CI 服务器(continuous-integration)上设置了这两个工具,它们是 phpUnderControl 使用上述和 CruiseControl、phpUnitXdebug(一些代码度量等)等工具。

unit-testing是我们目前缺乏的东西。但是我们现在做的是,每当我们在解析引擎中发现一个bug时(我们将文本解析为特定格式),我们会编写一个测试来确保它不会再次出现。我还编写了一些基本测试来检查URL路由和内部XMLRPC API,但这真的需要改进。我们同时使用phpUnit风格的测试和phpt
CI服务器每天构建几次新版本,生成图表、文档和各种报告。
除了上述所有工具之外,我们还使用Google Apps(主要用于电子邮件),并在Google Sites Wiki上保留所有其他文档。例如,部署程序、QA测试列表等。

这正是我感兴趣的内容!我现在没有时间阅读,但是谢谢,我迫不及待地想坐下来好好阅读它。 - noob source

1

我注意到这个问题并没有得到很多关注。这也是我感兴趣的事情。你知道Phing吗?你试过它吗?

安德鲁


谢谢回答!我知道Phing,但还没有尝试过。构建系统本身,无论是Phing、纯shell脚本还是其他什么,都是我感兴趣的一部分。另一部分是PHP开发人员如何处理数据库版本控制,以及是否有任何相关工具可用。 - noob source


1

关于数据库的更改,我们在版本控制系统中有一个目录:

+ dbchanges
|_ 01_database
|_ 02_table
|_ 03_data
|_ 04_constraints
|_ 05_functions
|_ 06_triggers
|_ 07_indexes

当您对数据库进行更改时,将.sql文件放入正确的目录中,并运行集成脚本,按顺序浏览这些目录,并将每个更改导入到数据库中。
sql文件必须以注释开头,当集成脚本导入更改并描述其所做的工作时,该注释将显示给用户。 它将每个已导入的sql文件的名称记录到一个文件中,因此下次运行脚本时,它不会再次应用相同的更改。
通过这种方式,所有开发人员都可以简单地运行脚本以使db保持最新状态。

但是您是否可以轻松地回滚模式更改? - philfreo
很遗憾,如果你想要这样的操作,你必须也存储相反的操作,但是对于DELETE这样的语句来说是不可能的。 - K. Norbert

0

@andrew:我曾尝试过Phing,最终使用了phpUnderControl。Phing的问题在于要管理代码覆盖率,必须实际上包含项目中的所有文件,而对于我们的项目来说,这并不适用。CruiseControl的方法对我们更有效。你可以试试它们,两者都很容易设置 - 艰苦的工作是构建测试....


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