【问题标题】:SVN Apache post-commit update web filesSVN Apache 提交后更新 web 文件
【发布时间】:2012-11-19 16:22:08
【问题描述】:

所以我在我们的网络服务器上安装了 SVN。这个想法是,工作副本被加载到开发人员机器上,当它们提交(冲突除外)时,服务器执行提交后 bash。

Repositories 是基于每个项目的,想法是在提交后,bash 文件需要强制删除整个项目文件夹和文件,并将更新的 repo 导出回项目文件夹,以通过 SVN 保持网站更新...我知道这种方法肯定会有一些分歧,但它对我们有用...除了一件事...

当服务器重新导出项目时,向网站发出的任何请求都会引发错误,因为缺少大量文件...有没有办法在 SVN 导出时“排队”apache/php,然后“恢复” “请求?

服务器导出文件的速度非常快,但正是在这几毫秒内,有人捕获了服务器并引发了 PHP 错误...

如果有解决此问题的典型方法,请告诉我...

谢谢

【问题讨论】:

    标签: php apache svn centos


    【解决方案1】:

    您可以通过在新目录树中构建内容然后重命名内容来最小化中断。也就是说,假设您的内容在 /var/www/myproject 下可用,您的更新后脚本将:

    • 填充/var/www/myproject.new
    • /var/www/myproject 重命名为/var/www/myproject.old
    • /var/www/myproject.new 重命名为/var/www/myproject
    • 删除/var/www/myproject.old

    虽然不是原子更新,但执行两次重命名所需的时间将很短,应该会大大改善这种情况。

    【讨论】:

    • 另见stackoverflow.com/questions/307437/…>,这是使用符号链接的类似想法。
    • 这么简单的解决方法,奇怪的是我怎么没想到...压力很大:S 非常感谢
    【解决方案2】:
    1. 您不能导出整个树,而只能导出受此修订影响的文件,并在不删除站点的情况下替换文件
    2. 您仍然可以执行完全导出和完全替换,但不能在挂钩中删除站点,只能覆盖旧文件(在修订文件中删除,您在站点上保持原样,不会破坏它,因为它们不相关)并在夜间 cron-job 中执行完全同步(每天或每周)

    【讨论】:

      【解决方案3】:

      我不知道以下内容是否对您有用,但您可以制作一个两步代码升级脚本:

      1. 临时目录中的 SVN 结帐
      2. 将生产目录中的所有代码替换为 tempdir 中包含的数据
      3. 删除临时目录

      你永远不会经历冲突。

      顺便说一句,我认为这不是最佳做法。您应该解决客户端开发人员机器上的冲突。

      【讨论】:

      • "Conflicts asside" 这不是解决冲突,SVN 会在你提交之前帮助解决这个问题……但无论如何,谢谢,@larsks 很有意义
      【解决方案4】:

      我真的觉得@Larsks 的回答足够实用,可以提供当时几乎是原子的和需要的解决方案,所以我将他的回答保持为“正确”,但我认为我也会考虑This Post

      假设 mv 是完全原子的,提交后挂钩 bash 可能如下所示:

      svn export file:///svn/repo /var/www/projectdir_NEW --force
      mv /var/www/projectdir /var/www/projectdir_OLD
      mv /var/www/projectdir_NEW /var/www/projectdir
      rm -rf mv /var/www/projectdir_OLD
      

      唯一的问题是 2 个 mv 命令之间的几秒钟,这是最接近原子和最干净的方法...但是,对于完全原子的影响,假设我不介意使用小 PHP,因为我的项目有一个全局 init.php,post-commit 可以这样做:

      date > /var/www/projectdir.updating
      svn export file:///svn/repo /var/www/projectdir_NEW --force
      mv /var/www/projectdir /var/www/projectdir_OLD
      mv /var/www/projectdir_NEW /var/www/projectdir
      rm -rf mv /var/www/projectdir_OLD
      rm /var/www/projectdir.updating
      

      创建一个名为“projectdir.updating”的临时文件,其中包含日期,执行更新,然后删除临时文件,我现在可以使用我的 init.php 来“限制”任何请求:

      while (file_exists("/var/www/projectdir.updating")) usleep(200);
      

      此外,我可以检查保存在临时文件中的日期详细信息是否有错误退出...(如果导出无法删除 .updating 文件)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        • 2011-10-11
        相关资源
        最近更新 更多