1) 将配置与其余代码分开。然后,其余代码应该能够在所有 3 个位置上运行而无需修改。一个典型的配置文件可能是:
<?
$db = "main_db"; $db_user="web1"; $db_pass = "xyz123";
$site ="example.com";
$htroot = "/var/www/prod/htdocs"
?>
对于测试环境:
<?
$db = "test_db"; $db_user="web1"; $db_pass = "xyz123";
$site ="test.example.com";
$htroot = "/var/www/test/htdocs"
?>
不要在代码库中包含带有密码的配置文件。代码库可能会通过不安全的连接复制或稍后存储在第三方代码托管服务器上(见下文)。而且您可能不希望在代码的所有备份磁盘上都有密码。
您还可以创建一个配置文件并根据代码运行的环境使用开关:
<?
$site = $_SERVER["HTTP_HOST"];
if ($site == "example.com"; ) {
$db = "main_db"; $db_user="web1"; $db_pass = "xyz123";
$htroot = "/var/www/prod/htdocs";
}
if ($site == "test.example.com") {
$db = "test_db"; $db_user="web1"; $db_pass = "xyz123";
$htroot = "/var/www/test/htdocs";
}
?>
但是现在您可能会想将其放回代码库中,如上所述,这不太安全。如果你不把它放在那里,你必须更新 3 个文件,或者每台服务器使用一个固定位置,并且你必须确保代码在每台服务器上都能找到文件。我个人更喜欢上面的每个站点一个文件的解决方案。
2)您已经有“版本”。现在有一个版本在 prod 上运行。给它一个唯一的名称和编号,它永远不会再改变。您可以在备份代码时使用该版本名称,当您引用版本或将其移动到某个位置时,您可以命名将在版本之后包含它的子目录。
您将在不久的将来投入生产的版本是一个不同的版本,如果您再次进行更改,这也是一个不同的版本。
作为经验法则:当您移动或导出代码、在位置之间交换或交换或升级时、进行演示时、在每个功能或里程碑之后以及每次执行完整备份时,都增加版本号。
请注意,配置文件(3 个,一个用于 prod、test 和 dev)不是版本的一部分。因此,您可以“移动版本”,但不能“移动配置文件”。如果可以,请将配置文件与其余代码放在树之外,这样您就不需要将它们分开,并且在以后移动版本时要小心。您可以将配置“向上”移动一个目录并从如下文件中访问它们:
“包括../config.php”;
3) 如果你想使用版本控制系统,它们做得很好,但需要一些时间来适应它,如果你急于更新,现在可能不是开始使用它的合适时间。但我会在未来推荐使用最新一代的分布式版本控制系统。分布式意味着您不需要设置服务器以及更多优势。我将命名为bazaar,如果有必要通过 ftp 进行更新,它可以做到。请注意,版本控制系统使得版本交换非常快,因为只写入版本之间的差异。Bazaar有一个社区和文档,可以轻松上手。还有Git,它拥有最新的商业托管站点:http://github.com。您可以在线查看代码并在版本之间进行比较,还有更多有用的功能,即使您是唯一的编码员,但在一个组中它会更好。系统之间的选择并不容易。我不能推荐 CVS,它已经过时了。另外 SVN 不是最新一代的分布式版本控制系统,如果没有特定的原因,我不建议使用它,它会用特殊的子目录污染你的所有子目录,这可能很烦人。对于习惯它并且已经在其中编写代码的人来说,这很好,但对于初学者来说,我会说不要。
分布式和开源版本控制系统中还有Mercurial和Darcs 。Mercurial 还有一个用于协作和在线代码查看的出色商业网站 ( http://bitbucket.org )。
4)只要你不使用版本控制系统,使用符号链接怎么样?
您可以在服务器 src/versions/ 某处有一个目录,并将命名的版本放在那里,每个版本都在它们自己的子目录中。您只会添加版本(因为存在的版本不会被更改,如果您更改它就会成为新版本)
您可以使用 src/versions/v001/src/versions/v002/src/versions/v003/ 或您使用的任何命名方案。
现在技巧来了:/var/www/prod/htdocs 是 src/versions/v001/ 的符号链接
当您升级到 v002 时,您只需执行以下操作:
- 关闭阿帕奇
- 删除旧的符号链接 /var/www/prod/htdocs (此时 apache webroot 已经消失了!)
- 创建新的符号链接 /var/www/prod/htdocs 作为 src/versions/v002 的链接
- 启动阿帕奇
你也可以为此编写一个带有参数的脚本并像这样调用它:
upgrade-web prod 002
这使得间隙更短。
有时你必须做一个“回退”,当你发现新版本在生产中有错误,你必须回去。这很容易(因为您不删除旧目录,您只需停止 apache,删除符号链接并将其重新创建到以前的位置,在本例中为 src/versions/v001 )
如果 test 和 dev 在同一台服务器上,您当然也可以符号链接相同的目录,因此不会有任何移动或复制。
5)如果你手动做没有符号链接,为什么不移动而不是复制?
(当文件还没有在同一台服务器上时,您可以将它们复制到附近的某个地方,然后开始迁移,这样您就不必停止服务器这么长时间)
如果项目的根级别有多个目录,您可以一次移动它们一个。确保不要移动配置文件。或者找一些策略给他们带来bakc。工作流程将是:
- 停止阿帕奇
- 移走根级别上的所有当前 prod 目录和文件,除了配置文件
- 将所有新的产品目录和文件移动到根级别,除了配置文件
- 启动阿帕奇
6)尝试找到你完美的个人文件和目录布局和完美的工作流程。这可能需要一些时间和一些思考,但它是值得的。在一张纸上做,直到找到最佳解决方案。这可能意味着您必须重构代码并更改服务器配置文件,但在未来,当您进行管理和升级时,您的生活会更轻松。根据我的经验:这一步不要等太久。您的布局应该使升级变得容易和安全。升级不是什么特别的事情,它是例行公事,应该安全且简单。
7)如果您命名您的服务器和工作站环境(我猜服务器的操作系统是 linux,但它是托管服务器还是根服务器,您是否有 ftp 访问权限或 shell (ssh) 访问权限或 sftp?您在哪里开发,在 Windows 机器上,还是在 Mac 上?)然后人们可以命名工具来进行复制和移动。也很有趣:测试和开发服务器是否是同一台机器,如果不是,它们是如何连接的,或者它们不是?如果没有,您将进行 3 向传输(将其复制到本地工作站,然后复制到服务器)。
8)考虑文件权限。如果您移动文件或复制它们,则文件权限可能会更改,并且如果应用程序依赖于其中的一些文件,则应该有一种方法来检查并且可能会更改。示例:某些应用程序需要可写目录,它们将上传的文件或会话文件或模板缓存放置在其中。其他应用程序不允许某些安全文件可写。