【问题标题】:php, user-uploaded files, version control, and website deploymentphp、用户上传的文件、版本控制和网站部署
【发布时间】:2011-01-30 23:51:07
【问题描述】:

我有一个网站,我会定期更新代码。我把它保存在版本控制中。当我想部署站点的新版本时,我会进行导出,然后将服务目录名称符号链接到部署目录。

有一个用户可以上传文件的地方,我曾经注意到,在我部署了一个新版本之后,用户文件就不见了!当然,我没有将它们添加到存储库中,并且由于提供的站点来自导出,因此它们无论如何都没有上传到版本控制的目录中。

PHP 还没有集成 svn 功能,所以我不能以编程方式对用户上传的文件做很多事情。我的解决方案是创建一个额外的网站 files.website.com,它位于服务网站的并行目录中,并且在版本控制下的目录之外提供服务。这样,当我升级到网站时,它们就不会消失。时不时手动将上传的文件添加到svn项目中,删除用户删除的,提交新版本。我正在编写一个从 cron 运行的 shell 脚本来执行此操作,但这不是我的强项,所以它处于次要位置,因为它不是一个紧迫的需求。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: php svn version-control architecture deployment


    【解决方案1】:

    我通常不会将用户生成的数据/文件保存在 svn 中。只有代码,数据库模式/测试数据。我通常部署的是来自最新工作副本的 rsync,其中不包括上传目录和 .svn 目录。 IMO 内容应该由更传统的文件系统/数据库备份机制而不是版本控制来处理。

    编辑:

    为了清楚起见,您的符号链接策略似乎是一种很好的做法。你只是错过了它认为的备份部分。 Id 可能只是 tar | gzip cron 作业中上传的内容,而不是与 SVN 交互。然后可能有一个单独的使用mysqldump 转储数据库和gzip

    【讨论】:

      【解决方案2】:

      在需要升级时,我将继续导出站点的做法,但有一个符号链接到版本控制目录之外的目录,其中包含用户上传的内容。这样,当您进行导出时,您只需要在符号链接被吹走时重新创建符号链接。然后,您当然应该根据需要备份该用户内容。

      【讨论】:

        【解决方案3】:

        您可以将部署目录设置为 subversion checkout(来自生产分支),而不是手动执行导出和管理符号链接。这样,部署就像检查生产分支的更新一样简单。

        只要您对 subversion 服务器和托管设置有足够的控制权,并且您的 subversion 存储库“准备好运行”,它就可以工作。在这种情况下,您的用户目录在 subversion 中可能是一个空的占位符,并且会被提交时运行的更新过程单独留下(svn update 的业务照常进行)。我仍然建议(如@Flash84x 和@prodigitalson 所述)一个单独的过程来备份用户内容。

        有一个Ars Technica article 描述了如何设置它。

        更新:如果您采用这种方法,请确保您的 Web 服务器不允许访问部署结帐中的 .svn 文件。

        【讨论】:

        • 是的,但管理符号链接的一个好处是我可以立即回滚到以前的实时版本,只需更改符号链接。
        • @user151841:你也可以做一个反向合并来做同样的事情svn merge -r HEAD:$PREV_REV $SVN_URL授予更改链接更简单:-)
        猜你喜欢
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 2011-03-23
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多