PHP代码部署技巧

25
过去,我一直以业余的方式开发,意味着我有一台本地机器,在那里开发和测试代码,并有一台生产机器,在完成后将代码复制到该机器上。最近,我稍微修改了这个过程,改为在本地开发,将代码检入 SVN,然后通过 SVN 更新生产机器。
现在我想开始一个新项目并改进我的工作流程。理想情况下,我希望有以下几点:
  • 拥有一个或多个本地开发环境
  • 在本地机器上进行开发和测试
  • 使用 SVN(或 Git)作为代码存储库
  • 使用构建工具来设置新环境(包括开发、暂存或生产),并部署代码
由于我对这个过程不是很熟悉,因此我正在寻求关于如何最佳设置这个想法以及要使用的工具的建议,特别是涉及构建工具时。我正在研究 Ant 和 Phing(可能还有 make),但我是如此新手,以至于我真的想得到一些指导。是否有任何有关 PHP 部署的好的教程或书籍,特别是针对初学者的?我特别感兴趣的是以下主题:
  • 向具有不同设置的不同类型的服务器部署 (例如,开发使用不同的数据库、数据库密码、PHP 错误报告,而生产或暂存则不同)。
  • 自动从 SVN 拉取代码的部署。
  • 为生产环境设置临时的“维护”页面。
  • 一旦掌握了上述技能,甚至可以在构建过程中进行一些测试。
我知道我的问题可能听起来很混乱...... 我承认,我对此是新手,也许有点离题。这就是为什么任何帮助都将不胜感激。

你在这个阶段成为了真正的开发者,很棒!此外,我认为这个问题已经在 Stack Overflow 上得到了回答。 - dynamic
+1,我也对此很感兴趣。 - Joris Ooms
http://programmers.stackexchange.com/questions/62852/php-project-deployment - OnesimusUnbound
不完全是同一个问题,但肯定有关联。 - tylerl
3个回答

3
我建议将测试部署策略制作成一个生产就绪的安装脚本,因为您最终肯定会需要这样一个脚本。
以下是一些可能对某些人显而易见,但值得指出的提示:
  • 你在版本控制系统中保存的配置文件应该是一个模板,并且应该与最终包含实际设置的文件命名不同。例如:config-dist.phpconfig-sample.confsample/config-mysql.php或类似的名称。否则,您将意外地检查服务器特定的配置文件而覆盖您的模板。
  • 对于 PHP 部署,请预计有些用户将无法通过除 Web 服务器本身以外的任何机制运行服务器端脚本。基于 PHP 的安装程序几乎是不可避免的。
  • 您应该包括一个适合消费者的更新机制,对此,WordPress 是一个值得模仿的项目的好例子。PHP 脚本可以 (a) 下载最新版本,(b) 使用 ftp 函数更新您的应用程序文件,(c) 执行更新脚本,使数据库等进行适当的更改。
  • 千万不要像[已删除]那样让您的用户为每个点发布单独下载和安装补丁。让他们下载包含至今所有更新的最新(最终)版本,并按顺序应用正确的 ALTER TABLE 函数。
无论文件是通过SVN还是FTP部署的,安装/更新机制都应该相同:获取最新文件,运行更新脚本。更新程序使用PHP脚本中列出的版本和DB中列出的版本,并利用这些信息按顺序应用适当的DB补丁。至于如何生成这些补丁,这里有其他问题可以供您参考了解更多信息。
至于“维护”页面,只需使用上述提到的版本技巧触发它(将DB中的版本与PHP代码中的版本进行比较)。能够将站点标记为“关闭”对公众不可见但对管理员可见也很有用(就像Joomla一样),您可以通过数据库或文件系统标志来触发它。
至于自动从SVN拉取代码,我建议您最好使用cron脚本或提交触发器而不是将其纳入应用程序中,因为这对最终用户没有影响。

作为一点提示:WordPress 的更新机制容易受到中间人攻击,如果攻击者能够“插入”位于 WordPress 部署服务器和当前正在更新的 WordPress 安装所托管的 Web 服务器之间。 - damianb
@Obsidian:对于通过互联网访问的每一份数据都是如此。唯一的对抗方式是使用加密签名(无论是安全套接字还是签名文件),如果你非常担心,可以将其作为升级过程的一部分。 - tylerl

3

这不完全是你的问题的一部分,但它与之相关:

如果您要分发面向广泛受众的代码,我建议您选择构建和分发OpenSSL签名的PHAR包。您可以通过HTTP进行分发而不会出现问题,并且由于它们是OpenSSL签名的,因此还减轻了中间人攻击风险,并保护终端用户/客户/客户免受某人注入代码的影响,如果您想设置自动或单击更新。

过去我曾经贡献过的一组工具非常适合此操作,但您需要PHP 5.3,或者您需要通过PECL安装了PHAR的PHP 5.2。https://github.com/koto/phar-util

至于测试,PHPUnit是事实上的标准。


1
这一切都是准确的。但我建议避免强制要求用户安装pecl(甚至pear)包才能使用您的软件,除非绝对必要。至少有一个备选方案(例如,仅在安装PHAR时支持签名验证,但不需要使用该软件)。当然,安装pecl包很简单,但并不是所有用户都有这种自由。 - tylerl
@tylerl,说实话,这是我只支持PHP 5.3的两个原因之一(另一个原因是即使Zend现在也不支持它)。由于PHAR在5.3中是本地的,因此它允许我仅为官方内容推送PHAR分发,如果有人想从github获取源代码tarball,则可以(但他们必须修改它以使其在PHAR之外工作)。 - damianb

0
如果你对使用Git感兴趣,那么你应该看看CodeMeme的这个构建系统。根据你的描述,它似乎非常适合你。你可以将它作为子模块添加到任何项目中,并使用附带的代码定制一个构建脚本,以便在多个环境中部署到不同的服务器。它使用Git来构建代码进行部署,但不幸的是不支持SVN。

https://github.com/CodeMeme/Phingistrano


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