如何才能最好地设置我的PHP(LAMP)开发环境,以便拥有开发,登台和生产服务器。只需“点击”部署到任何一个,以及一键回滚到任何修订。回滚还应该将数据库模式和数据回滚到源代码当前的状态。
现在我已经使用shell脚本为一个应用程序完成了所有这些(除了数据库回滚功能)。我很想知道别人的环境是如何设置的,以及在布局方面是否有任何通用工具或最佳实践可供遵循。
那么,你是怎么做到的?您使用了哪些现有工具?
谢谢!
更新:只是澄清一下我对我感兴趣的内容存在一些困惑。
我真的希望人们能够了解他们的环境是如何设置的。
如果您运行PHP项目并且您的数据库架构处于版本控制中,那么您是如何做到的?你用什么工具?他们是在公司内部还是我们都可以在网上找到它们?
如果您运行PHP项目并且在提交(和/或每晚)上进行自动测试,那么您如何做?您使用什么源版本控制系统?您是否使用SVN并在提交后挂钩中运行测试?
如果你运行一个包含多个开发服务器,登台服务器和生产服务器的PHP项目,你如何组织它们以及如何部署?
我希望摆脱这一点是对其他人如何将所有东西粘在一起的好主意。
答案 0 :(得分:12)
我们的生产环境包括以下内容:
我们的开发环境是运行数据库和httpd的单个服务器,配置方面我们为每个人设置了不同的工作空间,我们的VC是颠覆。分段也很简单 - 它运行在其中一个前端。
数据库更改
最初我们花了很多时间在数据库设计上,似乎真的得到了回报。我们现在五个月内没有改变任何重大事项。我们部署的大多数更改都在前端。现在,到目前为止,我们手动对数据库进行了所有更改,并且我总是编写一个小脚本来还原。
如果我有更多这些,我会在这里使用Doctrine和Migrations。我从来没有真正有机会在制作中使用它们,但我已经广泛使用它们并且它们看起来非常强大。
<强>部署强>
因此,每当我们部署新版本时,我们都会创建一个代码标记,我们会在暂存时检查这些代码,然后查看几个检查列表等,然后我们在生产前端部署代码。为了完成所有部署,我在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 Coding standard,我们使用PHP_CodeSniffer(phpcs)进行检查。当我说几句话时,我的意思是我分叉了所提供的嗅觉,并添加了一些我自己热情的例外。
除了编码风格之外,phpcs还会检查内联文档。本文档最后由phpDocumentor创建。
<强> CI 强>
我在CI服务器中设置了这两个工具( continuos-integration ),使用上面的phpUnderControl和CruiseControl,phpUnit,{{3 (一些代码指标...)等等。
单元测试是我们目前缺乏的。但我们现在所做的是,我们在解析引擎中找到的每个错误(我们将文本解析为某些格式),我们编写测试以确保它不会回来。我还编写了一些基本测试来检查URL路由和内部XMLRPC API,但这确实有待改进。我们同时使用phpUnit样式的测试和Xdebug。
CI服务器每天构建一个新版本,生成图表,文档和各种报告。
除了提到的所有工具之外,我们还使用Google Apps(主要用于电子邮件),并将Google Sites wiki与所有其他文档保存在一起。例如,部署程序,QA测试列表等。
答案 1 :(得分:1)
我注意到这并没有得到太多曝光。这也是我感兴趣的东西。你知道Phing吗?你试过吗?
安德鲁
答案 2 :(得分:1)
答案 3 :(得分:1)
对于数据库更改,我们在VCS中有一个目录:
+ dbchanges
|_ 01_database
|_ 02_table
|_ 03_data
|_ 04_constraints
|_ 05_functions
|_ 06_triggers
|_ 07_indexes
当您对数据库进行更改时,将.sql文件放入正确的目录中,然后按顺序运行通过这些目录的集成脚本,并将每个更改导入到db中。
sql文件必须以注释开头,注释会在集成脚本导入更改时显示给用户,并描述它的作用。它将每个导入的sql文件的名称记录到一个文件中,因此下次运行该脚本时,它不会再次应用相同的更改。
这样,所有开发人员都可以简单地运行脚本来使db更新。
答案 4 :(得分:0)
@andrew:我已经尝试过Phing并最终得到了phpUnderControl。 Phing的问题在于,为了管理代码覆盖,它必须实际包含项目中的所有文件,这对我们的项目来说并不是这样。 CruiseControl的方法对我们来说效果更好。给他们一个尝试,他们都很容易设置 - 艰苦的工作是建立测试....