3

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

在为客户处理更新时,我喜欢在发布之前向客户预览它们。

过去我使用了几种不同的解决方案,但没有一个让我满意。到目前为止我所做的:

  • 在索引中定义VERSIONs 和。CURRENT_VERSION参观者看到批准的版本。我向客户发送一个设置变量的特定链接,$_SESSION让他们看到新版本。在代码中,我使用 if 和 switch 来根据CURRENT_VERSION. 这很有效,将所有代码保存在一个地方,并且可以轻松地进行错误修复,但会使代码充满愚蠢的if(CURRENT_VERSION >= V2)语句。我也不能在 CSS 文件中使用它。
  • 将所有文件放在“build1”文件夹中,当开始需要预览的大更新时,我将所有文件复制到“build2”文件夹中。我为客户端上传“build2”文件夹并用密码保护它。这工作得很好,但是,如果我必须在处理 build2 时修复 build1,我必须确保将修复从 build1 复制到 build2。
  • 使用开发服务器(一些客户端可以提供)这是迄今为止效果最好的,因为开发服务器与实时站点是分开的。它的工作原理与第二个解决方案非常相似,我必须制作项目的副本,但对我来说感觉更干净。

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

4

2 回答 2

1

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

我建议你要做的第一件事就是把你的项目放到 Git 中,越快越好!

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

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

GitHub

我承担的每个项目都有一个单独的存储库

开发服务器

Git 存储库,复制我的 GitHub(我稍后会解释)

/opt/git-bare

我所有项目的虚拟主机

/var/www/vhosts

本地机器

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

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

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

分期

这是我在 GitHub 上的主分支的克隆,来自GitHub。这就是我用来向客户展示和签署更改的方法。

生产

我的生产服务器是来自 GitHub的标签的克隆。无论我在主分支中做什么,生产都不会受到影响,如果我的一台服务器出现任何问题,我可以轻松地使用此标签进行重建。

如果您对此有任何疑问,请直接开火。

于 2012-11-30T15:56:18.310 回答
0

在我长长的回答之前:如果您正在寻找可以为您执行此操作的主机,stackable支持多个“环境”的概念。我确信其他托管平台提供了类似的功能,允许基本相同的事情(例如AWS Elastic Beanstalk),但我不知道有哪个是该产品的核心。注意:我与stackable没有任何联系,我什至不是客户。


在索引中定义 VERSIONs 和 CURRENT_VERSION ......但是用愚蠢的 if(CURRENT_VERSION >= V2) 语句来混淆代码。我也不能在 CSS 文件中使用它。

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

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

尽管您对缺点是正确的,但在某些情况下,这是测试新功能的有用方法。

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

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

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

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

如果您修复旧版本中的错误,您应该能够通过一些命令轻松(或比当前工作流程更容易)将该修复合并到新版本中。如果您修复了旧版本中的新版本中的错误,则进行挑选可以让您将单个更改合并回旧版本中。

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

使用开发服务器(一些客户端可以提供)这是迄今为止效果最好的,因为开发服务器与实时站点是分开的。它的工作原理与第二个解决方案非常相似,我必须制作项目的副本,但对我来说感觉更干净。

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

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

于 2012-11-30T16:09:26.600 回答