(php / mysql)部署到共享主机的最佳实践?

时间:2009-08-15 11:19:53

标签: php deployment staging

我曾在一家网络开发公司工作,在那里我们有本地机器,登台服务器和许多生产服务器。我们在perl中处理mac并使用svn提交stage,并将perl脚本加载到生产服务器。现在我正在开发自己的项目,并希望在使用共享Web托管时找到良好的Web开发实践,而不是在基于unix的环境中工作(我可以使用perl / bash脚本/ cron作业完成所有的魔术)< / p>

所以我的问题是我的条件,这是:

  • 我使用来自外部提供商的单一标准共享网络托管(使用ssh访问)
  • 我正在与至少一个其他人合作并打算使用SVN进行源代码管理
  • 我在Windows下开发php / mysql(但是使用linux是可能的)

您建议对代码/数据的测试,部署和迁移进行哪些设置?我在本地计算机上安装了xampp服务器,但不确定哪些方法用于在Windows下迁移数据等。

3 个答案:

答案 0 :(得分:10)

我在共享托管上有一些PHP个人项目;这里有几点想法,从我在其中一个(最活跃的,需要一些至少半自动同步方式)上做的事情

关于我的设置的几句话:

  • 前段时间,我在SVN上拥有一切;现在,我正在使用bazaar;但是这个想法完全相同(除了,有市集,我有本地历史和所有这些)
  • 我有一个ssh访问生产服务器,就像你做的那样
  • 我专注于Linux (因此,我所做的事情可能不如Windows一样简单)

现在,我的工作方式:

  • 生产服务器(源代码,图片,...)上的所有东西都被提交给SVN / bazarr /无论
  • 我在本地工作,使用Apache / PHP / MySQL (我使用我偶尔在本地导入的生产数据库转储)
  • 我是唯一一个参与该项目的人;对于一个2/3开发人员的小团队来说可能没问题,但不会更多。

我之前做过的事情:

  • 我有一些PHP脚本检查了SVN服务器,以便在“最后一次修订到生产”和HEAD之间进行修改
    • 我猜这个自制的PHP脚本看起来像你现在使用的Perl脚本^^
  • 该脚本构建了一个要上传到生产的目录/文件列表
  • 并通过FTP访问上传
  • 这不是很令人满意(我的脚本中有错误,我想;我从来没有花时间纠正这些错误);并强迫我记住上次推送到生产的时间的修订号(好吧,它是由脚本自动存储在文件中的,所以不是那么难^^)

我现在做的事情:

  • 当切换到集市时,我不想重写那个无论如何都行不通的剧本
  • 我完全放弃了剧本
  • 由于我具有对生产服务器的ssh访问权限,因此我使用rsync从我的开发机器与生产服务器进行同步,而本地的内容被认为是稳定的/生产就绪的。

关于这种做事方式的几点说明:

  • 我没有登台服务器:我的本地设置足够接近制作的一个
  • 对于具有一个或两个开发人员的简单项目,没有登台服务器是可以的
  • 如果我有一台登台服务器,我可能会选择:
    • 当你想要上演
    • 时,对它进行“svn更新”
    • 当它没问题时,从登台服务器启动rsync命令(这将是最新的“稳定”版本,所以可以推送到生产中)
  • 有了更大的项目,有更多的开发人员,我可能不会采用这种设置;但我觉得这个(不是太大的)个人项目很不错。


这里唯一的“特殊”,可能是“面向Linux”的是使用rsync;快速搜索似乎表明可以在Windows上安装rsync可执行文件:http://www.itefix.no/i2/node/10650

但我从未尝试过。


作为旁注,这是我的rsync命令的样子:

rsync --checksum \
    --ignore-times \
    --human-readable \
    --progress \
    --itemize-changes \
    --archive \
    --recursive \
    --update \
    --verbose \
    --executability \
    --delay-updates \
    --compress --skip-compress=gz/zip/z/rpm/deb/iso/bz2/t[gb]z/7z/mp[34]/mov/avi/ogg/jpg/jpeg/png/gif \
    --exclude-from=/SOME_LOCAL_PATH/ignore-rsync.txt \
    /LOCAL_PATH/ \
    USER@HOST:/REMOTE_PATH/

我正在使用私钥/公钥mecanism,因此rsync不会要求输入密码,顺便说一句。

当然,我通常首先在“干运行”模式中使用相同的命令,以查看将要同步的内容,并选择“--dry-run

ignore-rsync.txt包含我不想被推送到制作的文件列表:

.svn
cache/cbfeed/*
cache/cbtpl/*
cache/dcstaticcache/*
cache/delicious.cache.html
cache/versions/*

在这里,我只是阻止缓存目录被推送到生产阶段 - 由于生产数据与开发数据不同,因此似乎不合理地发送缓存目录。

(我只是注意到这个文件中还有“.svn”...我可以将其删除,因为我不再使用SVN进行该项目^^)


希望这有点帮助...

答案 1 :(得分:1)

关于SVN,我建议你选择像beanstalk这样的专用SVN主机,或者使用相同的服务器来运行SVN服务器,这样两个开发人员都可以解决它。

在后一种情况下,您的部署脚本只会将位移动到暂存Web文件夹(可通过beta.mysite.com访问),然后另一个部署脚本可以将其移动到实时Web目录。直接部署到实际站点显然不是一个好主意。

如果您决定使用专用主机或想要从计算机部署到服务器,请使用rsync。这也是我目前的设置。 RSync 执行差异同步(通过SSH),所以它很快,它只是为这类东西而构建。

随着您的成长,您可以开始使用构建工具和单元测试等等。这只留下了数据同步问题。

我只从远程同步数据 - &gt;本地并使用DOS批处理文件,使用 mysqldump 通过SSH执行此操作。 Cygwin对Windows机器很有用,但您可以跳过它。 SQL导入脚本还运行一行查询来更新某些单元,例如主机名和Web根,以进行本地部署。

完成此设置后,您可以专注于编写代码和远程部署,或者本地同步和部署成为一键式处理。

答案 2 :(得分:1)

一种选择是为任务使用专用框架。 Capistrano非常适合像php这样的脚本语言。它基于Ruby,但如果你进行搜索,你应该能够找到如何使用它来部署php应用程序的说明。