基于php的差量更新工具

===== 二.脚本示例 =====
---------------------------------------------脚本更新处用绿色标明----------------------------------------------
---------------------------------------------------------------------------------------------HWSL_Update.php
<?php
/**
 * 差量更新工具
 * 
 * @author  zhanhailiang<zhanhailiang@huawei.com>
 * @version 0.2
 */
class HWSL_Update {
    //< 更新日志记录
    const CST_UPDATE_LOGFILE = '/data/logs/update/log';

    //< 需要更新的业务目录
    const WEB_INSTALL = '/data/web/itravel';

    //< 更新列表记录
    protected static $_updateList = array();

    public static function update($dest, $source) {
        if(!self::isRoot()) {
            echo "错误: 必须用root身份执行脚本.".PHP_EOL;
            exit;
        }

        //在当前目录生成临时目录,保存更新文件列表与更新脚本
        exec("rm -fR ./tmp");
        exec("mkdir ./tmp");

        self::sourceToDest($dest, $source);
        self::sourceToDest2($dest, $source);

        //生成更新脚本
        $tmp = str_replace($dest, self::WEB_INSTALL, self::$_updateList);
        $tmpcmd = join("\n", array("#!/bin/sh\n", join("\n", $tmp)));
        exec("echo \"$tmpcmd\" > ./tmp/update");
    }

    protected static function sourceToDest($dest, $source) {
        if(is_file($dest) && file_exists($source) && md5(file_get_contents($dest)) !== md5(file_get_contents($source))) {
            array_push(self::$_updateList, "cp " . basename($source) . " $dest");
            exec("cp $source ./tmp");
        } else if(is_dir($dest)) {
            $arr = scandir($dest);
            foreach($arr as $path) {
                if($path === '.' || $path === '..') {
                    continue;
                }

                $p = $dest . '/' . $path;
                $q = $source . '/' . $path;
                if(is_dir($p) && !is_dir($q)) {
                    //当$p路径在$source中不存在时,rm之
                    array_push(self::$_updateList, "rm -R $p");
                } else if(is_file($p) && !file_exists($q)) {
                    //当$p路径在$source中不存在时,rm之
                    array_push(self::$_updateList, "rm $p");
                } else {
                    self::sourceToDest($p, $q);
                }
            }
        }
    }

    //将$source目录下不存在于$dest目录下的目录和文件复制一份到$dest下
    protected static function sourceToDest2($dest, $source) {
        if(is_file($source) && !file_exists($dest)) {
            array_push(self::$_updateList, "cp " . basename($source) . " $dest");
            exec("cp $source ./tmp");
        } else if(is_dir($source)) {
            $arr = scandir($source);
            foreach($arr as $path) {
                if($path === '.' || $path === '..')
                    continue;

                $p = $dest . '/' . $path;
                $q = $source . '/' . $path;
                if(is_dir($q) && !is_dir($p)) {
                    array_push(self::$_updateList, "cp -R ./" . basename($q) . " $dest");
                    exec("cp -R $q ./tmp");
                } else if(is_file($q) && !file_exists($p)) {
                    array_push(self::$_updateList, "cp " . basename($p) . " $dest");
                    exec("cp $q ./tmp");
                } else {
                    self::sourceToDest2($p, $q);
                }
            }
        }
    }

    protected static function isRoot() {
        return exec('id -u') === '0';
    }
}

------------------------------------------又见华丽的分割线-------------------------------------------update.sh
#!/usr/local/services/php/bin/php
<?php
/**
 * 差量更新,持续集成工具
 * 
 * @author  zhanhailang<zhanhailiang@huawei.com>
 * @version 0.2
 */
require_once './HWSL_Update.php';

if($argc != 3) {  //< 检查参数数目合法性
    echo "合法的参数为:./update.sh [source] [dest]".PHP_EOL;
    exit;
} else if(!realpath($argv[1]) || !realpath($argv[2])) {  //< 检查路径合法性
    echo "路径输入不合法.请重新输入!".PHP_EOL;
    exit;
} else {
    $source = $argv[1];     //< 源路径
    $dest = $argv[2];       //< 目标路径

    //< 对于"../hwsl/"与"../hwsl"两种不同输入,统一处理为绝对路径
    $source = realpath($source);
    $dest = realpath($dest);

    if($dest === $source) {
        echo "源路径与目标路径一样.".PHP_EOL;
        exit;
    }

    //执行更新任务
    HWSl_Update::update($dest, $source);
}

打完收工!

附录:

阿晖的方案:

网站发布系统里制作差量的核心代码是下面这行:
diff -Pqr version/${version} version/${compare_version}|awk '{print $2;}'|sed 's/version\/${version}\///g'


diff + awk + sed的华丽组合
先生成一个diff.txt
然后从diff.txt里读取文件再tar打包


仅供参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值