控制PHP项目的多个版本

时间:2012-11-30 15:44:11

标签: php project-management

我偶然发现了以下问题,无法找到合适的解决方案。我用PHP为各种客户制作网站。像所有客户一样,有些人会发现需要修复的错误,有些会在几个月后请求更新现场网站,有些会同时执行。

在处理客户端的更新时,我喜欢在将它们放到实时之前预览它们。

我过去曾使用过几种不同的解决方案,但我都不满意。到目前为止我做了什么:

  • 在索引中定义VERSIONCURRENT_VERSION。访客可以看到批准的版本。我向客户端发送了一个设置$_SESSION变量的特定链接,让他们看到新版本。在我使用if的代码中,并根据CURRENT_VERSION切换显示新内容。这样可以将所有代码保存在一个地方,并且可以轻松地修复错误,但是使用愚蠢的if(CURRENT_VERSION >= V2)语句来填充代码。我也不能在CSS文件中使用它。
  • 将所有文件放在“build1”文件夹中,当启动需要预览的大型更新时,我将所有内容复制到“build2”文件夹。我为客户端上传“build2”文件夹并使用密码保护它。这很好用,但是,如果我在构建build2时必须修复build1,我必须确保将修复从build1复制到build2。
  • 使用开发服务器(某些客户端可以提供此服务)到目前为止这种方式效果最好,因为开发服务器与实际站点是分开的。它与第二个解决方案的工作方式大致相同,我必须复制一个项目,但对我来说感觉更清洁。

然而,我正在寻找一种更好的方法来管理我的代码,可能是使用Git / SVN,但如果他们可以帮助我,对这些事情知之甚少。

2 个答案:

答案 0 :(得分:1)

如今,一个相当典型的范例是开发/分期/生产。您不需要这种方法的整个开发服务器,VirtualHosts / nginx等效就足够了。

我建议你需要做的第一件事就是让你的项目进入Git,越快越好!

免责声明:这是我的工作流程,有很多人喜欢它,但这个是我的。

这是我当前工作流程的一个例子。

<强> GitHub的

我所参与的每个项目的单独存储库

开发服务器

裸露 Git存储库,复制我的GitHub(我会在短期内解释)

/opt/git-bare

我所有项目的VirtualHosts

/var/www/vhosts

本地计算机

我根据需要克隆我的裸存储库,以便快速编辑和提交。我并不担心FTP来回传输文件或在本地安装任何东西到我的机器上。我发现这是最佳项目的工作方式。当我准备在我的开发服务器上查看一些代码时,我只需提交并将我的工作推送到裸存储库,在那里我有一个 post hook ,然后告诉我的开发VirtualHost自我更新。 / p>

这意味着在提交/推送我的工作的几秒钟内,我可以通过我的浏览器在我的开发服务器上看到它。

当我对我在开发服务器上看到的内容感到满意时,我将裸机库推送到GitHub。 Git是一个很棒的工具,我所有的本地提交也可以在GitHub的日志中找到。

<强>分段

这是来自GitHub的克隆,是我在GitHub上的分支。这是我用来向客户展示并签署更改的内容。

<强>生产

我的生产服务器是GitHub的标记的克隆。无论我在我的主分支机构中做什么,生产都不会受到影响,如果我的服务器出现任何问题,我可以轻松地将这个标签用于重建。

如果您对此有任何疑问,请随便解雇。

答案 1 :(得分:0)

在我的长篇回答之前:如果您正在寻找能够为您做到这一点的主持人,stackable支持多个“环境”的概念。我敢肯定其他托管平台提供的功能基本相同(例如AWS Elastic Beanstalk),但我不知道哪一个是产品的核心。 注意:我没有任何可堆叠的连接,我甚至不是客户。


  

在索引中定义VERSION和CURRENT_VERSION ...但是使用愚蠢的if(CURRENT_VERSION&gt; = V2)语句来填充代码。我也不能在CSS文件中使用它。

如果我没记错的话,这实际上类似于Facebook推出更改的方式。你是对的,它增加了额外的逻辑;但是有一个优势,因为您可以将更改“预览”到多个用户(例如,所有管理员用户或特定地理位置的所有用户)。

当然,预览使用相同的数据 - 这意味着预览网站的用户将像往常一样使用它(而不是与人为数据的奇怪交互)。

虽然你的缺点是正确的,但在某些情况下这是测试新功能的有用方法。

  

将所有文件放在“build1”文件夹中,当开始需要预览的大更新时...但是,如果我在build2上工作时必须修复build1,我必须确保将修复从build1复制到build2。

在这里,您实际上是将两个版本的项目部署到同一台服务器上。在您给出的示例中,您将第二个副本放在原始webroot下 - 但是根据托管,您可以只分配一个子域并从两个不同的Web根目录开始工作。

优点与第一个类似,因为两个安装都可以轻松共享相同的数据,并且如果所有请求都通过某种类型的前端控制器,您可以添加逻辑以仅显示对选择用户的更改(或使用某种基本类型)正如你所描述的那样认真。)

在这种情况下,将项目置于版本控制中(正如我所看到的,git会比SVG更好)可以使这更容易。在您的开发系统上,只需在分支之间切换即可在现有版本和新版本之间工作。

如果您修复旧版本中的错误,您应该能够轻松地(或者比当前工作流程更容易)使用一些命令将该修复程序合并到新版本中。如果您修复了新版本中也存在旧版本的错误,那么执行一个错误选择可以让您将该单个更改合并回旧版本。

部署代码可以像登录Web服务器和执行git pull一样基本,也可以使用工具自动执行部署。基本上,旧版本的部署将基于存储库的“主”分支(或类似的东西),新版本将基于您所谓的分支。

  

使用开发服务器(某些客户端可以提供此服务)到目前为止这种方式效果最好,因为开发服务器与实际站点是分开的。它与第二个解决方案大致相同,我必须制作项目的副本,但对我来说感觉更干净。

由于这与您的第二种方法非常相似,因此添加版本控制肯定会使这更容易。

有大量资源解释如何从各种版本控制系统部署到各种托管平台,但希望这说明了这将如何适合您已经在做的事情并使您更容易。