
INSERT INTO `qb_config` (`id`, `type`, `title`, `c_key`, `c_value`, `form_type`, `options`, `ifsys`, `htmlcode`, `c_descrip`, `list`, `sys_id`) VALUES(0, 1, '系统升级每次核对文件数', 'sys_update_filenum', '10', 'number', '', 1, '', '留空则默认是1000,如果你的空间性能太差,就手工调为50甚至10', 0, 0);
导入数据库后,需要在下面那里做设置,如下图

把数值相应调小,测试看看能否正常升级。
复制下面的代码修改两个文件后,将会实现如下图的效果.

要实现分页检验文件的话,需要修改两个文件.
> 复制下面的代码替换`applicationadmincontrollerUpgrade.php`中的内容
namespace appadmincontroller;r
r
use appcommoncontrollerAdminbase;r
use appcommonmodelModule;r
use appcommonmodelPlugin;r
use appcommonmodelHook_plugin;r
use appcommonmodelMarket as MarketModel;r
use appcommonmodelTimedtask AS TaskModel;r
r
class Upgrade extends Adminbaser
{r
public function _initialize(){r
parent::_initialize();r
if(config('client_upgrade_edition')==''){r
config('client_upgrade_edition',RUNTIME_PATH . '/client_upgrade_edition.php');r
}r
}r
r
public function index()r
{r
$this->clean_cache();r
$array = @include(config('client_upgrade_edition'));r
$this->assign('upgrade',$array);r
return $this->fetch('index');r
}r
r
r
protected function clean_cache(){r
cache('timed_task',null);r
cache('cache_modules_config',null);r
cache('cache_plugins_config',null);r
cache('hook_plugins',null);r
}r
r
r
private function writelog($upgrade_edition=''){r
$data = $this->request->post();r
if($data['m']){r
$array = modules_config();r
foreach ($array AS $rs){r
$de = $data['m'][$rs['keywords']];r
if($de){r
$vs = $de['time']."t".$de['md5'];r
Module::update(['id'=>$rs['id'],'version'=>$vs]);r
}r
}r
}r
if($data['p']){r
$array = plugins_config();r
foreach ($array AS $rs){r
$de = $data['p'][$rs['keywords']];r
if($de){r
$vs = $de['time']."t".$de['md5'];r
Plugin::update(['id'=>$rs['id'],'version'=>$vs]);r
}r
}r
}r
if($data['h']){r
$array = cache('hook_plugins');r
foreach ($array AS $rs){r
$de = $data['h'][$rs['version_id']];r
if($de){r
$vs = $de['time']."t".$de['md5'];r
Hook_plugin::update(['id'=>$rs['id'],'version'=>$vs]);r
}r
}r
}r
if($data['t']){r
$array = cache('timed_task');r
foreach ($array AS $rs){r
$de = $data['t'][$rs['version_id']];r
if($de){r
$vs = $de['time']."t".$de['md5'];r
TaskModel::update(['id'=>$rs['id'],'version'=>$vs]);r
}r
}r
}r
$this->upgrade_mark($data['admin_style'],'admin_style');r
$this->upgrade_mark($data['index_style'],'index_style');r
$this->upgrade_mark($data['member_style'],'member_style');r
$this->upgrade_mark($data['qun_style'],'qun_style');r
$this->upgrade_mark($data['haibao_style'],'haibao_style');r
$this->upgrade_mark($data['model_style'],'model_style');r
$this->upgrade_mark($data['packet'],'packet');r
r
$this->clean_cache();r
if( file_put_contents(config('client_upgrade_edition'), '"'.$upgrade_edition.'","time"=>"'.date('Y-m-d H:i').'",];') ){r
return true;r
}else{r
return '权限不足,日志写入失败';r
}r
}r
r
r
private function upgrade_mark($data=[],$type=''){r
if($data){r
$array = MarketModel::get_list(['type'=>$type]);r
foreach ($array AS $rs){r
$de = $data[$rs['version_id']];r
if($de){r
$vs = $de['time']."t".$de['md5'];r
MarketModel::update(['id'=>$rs['id'],'version'=>$vs]);r
}r
}r
}r
}r
r
r
private function bakfile($filename=''){r
$bakpath = RUNTIME_PATH.'bakfile/';r
if(!is_dir($bakpath)){r
mkdir($bakpath);r
}r
$new_name = $bakpath.date('Y_m_d-H_i--').str_replace(['/','\'], '--', $filename);r
copy(ROOT_PATH.$filename,$new_name);r
}r
r
r
private function up_sql($filename=''){r
if(preg_match('/\/upgrade\/([w]+).sql$/', $filename)){r
//if(preg_match('/^\/application\/common\/upgrade\/([w]+).sql/', $filename)){r
into_sql(ROOT_PATH.$filename,true,0);r
}r
}r
r
r
private function up_run($filename=''){r
if(preg_match('/^\/application\/common\/upgrade\/([w]+).php$/', $filename)){r
$classname = "app\common\upgrade\".ucfirst(substr(basename($filename), 0,-4));r
}elseif( preg_match('/(application|plugins)\/([w]+)\/upgrade\/([w]+).php$/',$filename,$array) ){ //实际已包含了上面的r
$m_p = $array[1]=='application'?'app':'plugins';r
$model = $array[2];r
$file = $array[3];r
$classname = "$m_p\$model\upgrade\".ucfirst($file);r
}else{r
return;r
}r
if( class_exists($classname) && method_exists($classname, 'up') ){r
$obj = new $classname;r
try {r
$obj->up();r
} catch(Exception $e) {r
//echo $e;r
}r
}r
}r
r
r
r
public function sysup($filename='',$upgrade_edition=''){r
if($upgrade_edition){ //升级完毕,写入升级信息日志r
$result = $this->writelog($upgrade_edition);r
if( $result===true ){r
return $this->ok_js([],'升级成功');r
}else{r
return $this->err_js($result);r
}r
}r
list($filename,$id) = explode(',',$filename);r
if($filename==''){r
return $this->err_js('文件不存在!');r
}r
r
$str = $this->get_server_file($filename,$id);r
if($str){r
$filename = $this->format_filename($filename); //针对模块或插件的升级做替换处理r
$this->bakfile($filename);r
makepath(dirname(ROOT_PATH.$filename)); //检查并生成目录r
if( file_put_contents(ROOT_PATH.$filename, $str) ){r
$this->up_sql($filename);r
$this->up_run($filename);r
return $this->ok_js([],'文件升级成功');r
}else{r
return $this->err_js('目录权限不足,文件写入失败');r
}r
}else{r
return $this->err_js('获取云端数据失败,请确认服务器DNS是否正常,能否访问外网?');r
}r
}r
r
r
public function view_file($filename='',$id=0,$oldfile=''){r
r
$str = $this->get_server_file($filename,$id);r
r
if ( preg_match("/(.jpg|.png|.jpeg|.gif)$/i", $filename) ) {r
//header('Content-type:image/'.substr($filename,strripos($filename,'.')+1));echo $str;r
if (is_file(ROOT_PATH.$oldfile)) {r
echo "
";r
}r
$temp_file = "uploads/images/temp.".substr($filename,strripos($filename,'.')+1);r
file_put_contents(PUBLIC_PATH.$temp_file, $str);r
echo "";r
exit;r
}r
r
$this->assign('new_code',str_replace(['<','>'], ['<','>'], $str));r
$this->assign('old_code', str_replace(['<','>'], ['<','>'], file_get_contents(str_replace('//', '/', ROOT_PATH.$oldfile)) ) );r
r
return $this->fetch();r
}r
r
r
protected function format_filename($filename=''){r
if(strstr($filename,'/../../')){r
$filename = str_replace(['/../../template/','/../../plugin/','/../../hook/'], '/../../', $filename);r
$filename = preg_replace('/^\/..\/..\/([w]+)/','/',$filename);r
}r
return $filename;r
}r
r
r
public function check_files($upgrade_edition='',$page=0,$rows=1000){r
if ($this->webdb['sys_update_filenum']>0) {r
$rows = $this->webdb['sys_update_filenum'];r
}r
set_time_limit(0); //防止超时r
$array = $this->getfile($page);r
if(empty($array)){r
$str = http_curl("https://x1.php168.com/appstore/upgrade/get_version.html?id=46");r
if (!strstr($str,'md5')) {r
return $this->err_js('你的服务器无法访问齐博官网,请检查你的服务器DNS是否配置正确,或者是否设置了防火墙不能访问外网');r
}r
return $this->err_js('获取云端文件列表数据失败,请晚点再偿试');r
}r
$totalpage = ceil(count($array)/$rows);r
if (!$page) {r
set_cookie('need_update',0);r
return $this->ok_js($totalpage);r
}r
$data = [];r
$min = ($page-1)*$rows;r
for($i=$min;$i<$min+$rows;$i++){r
$rs = $array[$i];r
if (!$rs) {r
break;r
}r
// }r
// foreach($array AS $rs){r
$showfile = $this->format_filename($rs['file']);r
$file = ROOT_PATH.$showfile;r
if (is_file($file.'.lock') && file_get_contents($file.'.lock')=='hide') {r
continue; //用户不想升级的文件,也不想提示升级r
}r
$ispic = false;r
$change = false;r
$md5_size = '';r
if (!is_file($file)) {r
$change = true;r
}elseif( ($md5_size=md5_file($file)) != $rs['md5'] ){r
$change = true;r
if ( preg_match("/(.jpg|.png|.jpeg|.gif)$/i", $file) ) {r
$ispic = true;r
}elseif ( check_bom($file,true) ) {r
file_put_contents($file, check_bom($file));r
if (md5_file($file)==$rs['md5']) {r
$change = false;r
}//elseif(preg_match("/(\/|\)upgrade(\/|\)([w]+)(.sql|.php)$/i", $file)){r
//$change = false;r
//}r
}r
}r
if($change){ r
$data[]=[r
'file'=>$rs['file'],r
'showfile'=>$showfile,r
'md5'=>$md5_size,r
'id'=>$rs['id'],r
'islock'=>(is_file($file.'.lock')||(is_file($file)&&preg_match("/(\/|\)upgrade(\/|\)([w]+)(.sql|.php)$/i", $file)))?1:0,r
'ctime'=>is_file($file)?date('Y-m-d H:i',filemtime($file)):'缺失的文件',r
'time'=>date('Y-m-d H:i',$rs['time']),r
];r
}r
}r
r
$array_sql = $array_php = [];r
foreach ($data AS $key=>$rs){r
if( preg_match("/\/upgrade\/([w]+.sql)/i",$rs['file']) ){r
unset($data[$key]);r
$array_sql[$rs['file']] = $rs;r
}elseif( preg_match("/\/upgrade\/([w]+.php)/i",$rs['file']) ){r
unset($data[$key]);r
$array_php[$rs['file']] = $rs;r
}r
}r
ksort($array_php);r
ksort($array_sql);r
$data = array_values(array_merge($data,$array_sql,$array_php));r
$need_update = get_cookie('need_update')+count($data);r
set_cookie('need_update',$need_update);r
r
if ($page==$totalpage) {r
unlink(RUNTIME_PATH.'updatelist.txt');r
}r
if($page==$totalpage && $need_update<1){r
$upgrade_edition && $reustl = $this->writelog($upgrade_edition);r
return $this->err_js($reustl!==true?$reustl:'没有可更新文件');r
}else{r
return $this->ok_js($data?:[]);r
}r
}r
r
r
protected function get_server_file($filename='',$id=0){r
@set_time_limit(600); //防止超时r
$str = http_curl('https://x1.php168.com/appstore/upgrade/make_client_file.html?filename='.$filename.'&id='.$id.'&appkey='.urlencode($this->webdb['mymd5']).'&domain='.urlencode($this->request->domain()));r
if(substr($str,0,2)=='QB'){ //文件核对,防止网络故障,抓取一些出错信息r
$str = substr($str,2);r
}else{r
$str='';r
}r
return $str;r
}r
r
r
protected function getfile($page=0){r
if (!$page) {r
$str = http_curl('https://x1.php168.com/appstore/upgrade/get_list_file.html?typeid='.$this->webdb['typeid'].'&appkey='.urlencode($this->webdb['mymd5']).'&domain='.urlencode($this->request->domain()),['app_edition'=>fun('upgrade@local_edition')]);r
file_put_contents(RUNTIME_PATH.'updatelist.txt', $str);r
}else{r
$str = file_get_contents(RUNTIME_PATH.'updatelist.txt');r
} r
return $str ? json_decode($str,true) : '';r
}r
r
}r
?>
> 复制下面的代码替换`templateadmin_styledefaultadminupgradeindex.htm`中的内容
{extend name="index:layout" /}r
r
{block name="menu{/block}r
r
{block name="content\r
r
r
r
rr
.locktr td,.locktr td a{r
color:orange;r
}r
.progress_warp{r
position:fixed;r
top:65%; r
z-index:9999999999;r
width:100%;r
display:none;r
}r
.progress_warp .layui-progress{r
margin:0 200px;r
}r
r
| 选中升级 | r文件名称 | r升级前时间 | r更新时间 | r对比差异 | r
|---|---|---|---|---|
| r 正在获取云端数据信息,请稍候...r | r||||
| r r {{rs.i}}r | r{{rs.showfile}} | rr {{rs.ctime}}r | r{{rs.time}} | r对比差异r | r
,
齐博CMS相关栏目本月热门文章
- 1JPA+QueryDSL
- 2Cookie、Session、Token之间的区别到底在哪?
- 3springBoot使用自定义注解实现复杂校验
- 4Mybatis-plus学习笔记---乐观锁、逻辑删除、代码自动生成器等
- 5反射Field、Method、Constructor
- 6Servlet+mybatis整合Web项目
- 7SLF4j的介绍与使用+SpringBoot日志配置
- 8MybatisPlus【SpringBoot】 2 入门案例
- 9IntelliJ IDEA 2022免费激活码正规申请方法(IDEA官方激活注册码)
- 10Qt多线程编程简介
- 11商品管理模块微服务demo
- 12移动开发技术作业2
- 13SpringCloud 之OpenFeign 自定义配置和使用/自定义拦截器
- 14关于前端安全性那些事
- 15JSP超市管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
- 16java---数位dp---计数问题(每日一道算法2022.10.21)
- 17在javaweb项目中进行添加的时候,下拉框选中的数据怎末进行保存呢
- 18移动开发课程-作业二
- 19基本数据类型转换(java)
- 20Spring Boot工程配置多数据源,Cannot resolve configuration property dynamic
热门相关搜索北京印刷学院排名 北方工业大学排名 北京航空航天大学排名 首都经济贸易大学排名 中国传媒大学排名 首都师范大学排名 中国地质大学(北京)排名 北京信息科技大学排名 中央民族大学排名 中国戏曲学院排名 河北政法职业学院排名 河北经贸大学排名 天津中德应用技术大学排名 天津医学高等专科学校排名 天津美术学院排名 天津音乐学院排名 天津工业大学排名 北京工业大学耿丹学院排名 北京警察学院排名 天津科技大学排名 铁岭卫生职业学院排名 沈阳北软信息职业技术学院排名 吉林艺术学院排名 吉林体育学院排名 白城师范学院排名 通化师范学院排名 吉林农业大学排名 长春电子科技学院排名 吉林工业职业技术学院排名 吉林司法警官职业学院排名 吉林警察学院排名 长春健康职业学院排名 吉林水利电力职业学院排名 大庆师范学院排名 黑龙江大学排名 哈尔滨剑桥学院排名 哈尔滨铁道职业技术学院排名 哈尔滨应用职业技术学院排名 黑龙江民族职业学院排名 七台河职业学院排名 黑龙江生态工程职业学院排名 华东师范大学排名 上海健康医学院排名 华东理工大学排名 上海交通大学排名 同济大学排名 复旦大学排名 上海杉达学院排名 上海戏剧学院排名 上海音乐学院排名