设为首页 收藏本站
查看: 1369|回复: 0

[经验分享] 基于php的差量更新工具

[复制链接]

尚未签到

发表于 2017-3-31 08:47:38 | 显示全部楼层 |阅读模式
===== 二.脚本示例 =====
---------------------------------------------脚本更新处用绿色标明----------------------------------------------
---------------------------------------------------------------------------------------------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打包


仅供参考

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357899-1-1.html 上篇帖子: php启动session失败错误解决办法 下篇帖子: 使用Composer管理PHP依赖关系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表