php在线升级程序的方法

发布于2019-10-13 09:35:11  分类:PHP   阅读( 22 ) 

思路:在程序目录中放一个php文件存入版本号,在远程服务器updata目录存入升级包。后台点升级,程序开始判断是否版本一致,如果不同,则下载远程服务器上的升级包,解压后覆盖本地服务器上文件后,修改版本号,升级结束。php脚本如下:

/**
更新方法:远程服务器上upload目录存放最新的升级包,根据web目录存放并压缩为upload.zip,升级过程中会将这个压缩包下载到down目录,然后解压,复制替换相应文件。最后修改版本号。
**/
include('../inc/conn.php'); 
session_start(); 
//检测是否登录,若没登录则转向登录界面 
if(($_SESSION['userid'])!=1){ header("Location:login.php"); exit(); }?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="renderer" content="webkit">
    <meta http-equiv="Cache-Control" content="no-siteapp"/>
    <title>在线升级</title>
    <meta name="keywords" content="在线升级">
    <meta name="description" content="在线升级">
    <link rel="shortcut icon" href="favicon.ico">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</head> 
<body class="gray-bg">
    <a class="list-group-item active"><h3 class="list-group-item-heading text-center ">在线升级</h3> </a><br>
  <div class="text-center">
<h4>本机的程序版本为: <?php 
  $filename = fopen('version.php', 'r');
    while(!feof($filename)){
        $bdbb = fgetss($filename, 1024);//本地版本号
        echo $bdbb;
    }
    fclose($filename);
?>
</h4>
<?php
//远程下载文件函数
function getFile($url, $save_dir = '', $filename = '', $type = 0) {
    if (trim($url) == '') {
        return false;
    }
    if (trim($save_dir) == '') {
        $save_dir = './';
    }
    if (0 !== strrpos($save_dir, '/')) {
        $save_dir.= '/';
    }
    //创建保存目录
    if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
        return false;
    }
    //获取远程文件所采用的方法
    if ($type) {
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $content = curl_exec($ch);
        curl_close($ch);
    } else {
        ob_start();
        readfile($url);
        $content = ob_get_contents();
        ob_end_clean();
    }
    $size = strlen($content);
    //文件大小
    $fp2 = @fopen($save_dir . $filename, 'a');
    fwrite($fp2, $content);
    fclose($fp2);
    unset($content, $url);
    return array(
        'file_name' => $filename,
        'save_path' => $save_dir . $filename
    );
}
    
//复制文件夹内所有文件函数
function xCopy($source, $destination, $child){
      //用法:
      // xCopy("feiy","feiy2",1):拷贝feiy下的文件到 feiy2,包括子目录
	// xCopy("feiy","feiy2",0):拷贝feiy下的文件到 feiy2,不包括子目录
 if(!is_dir($source)){
	echo("Error:the $source is not a direction!");
	return 0;
	}
 if(!is_dir($destination)){
	mkdir($destination,0777);
	}
	$handle=dir($source);
	while($entry=$handle->read()){
 if(($entry!=".")&&($entry!="..")){
 if(is_dir($source."/".$entry)){
 if($child)
	xCopy($source."/".$entry,$destination."/".$entry,$child);   
 	}else{
	copy($source."/".$entry,$destination."/".$entry);   
 }
 }
 }
	return 1;   
 }
    
//删除文件夹下所有文件函数,使用方法:调用函数,传入路径deldir($path);
function deldir($path){
   //如果是目录则继续
   if(is_dir($path)){
    //扫描一个文件夹内的所有文件夹和文件并返回数组
   $p = scandir($path);
   foreach($p as $val){
    //排除目录中的.和..
    if($val !="." && $val !=".."){
     //如果是目录则递归子目录,继续操作
     if(is_dir($path.$val)){
      //子目录中操作删除文件夹和文件
      deldir($path.$val.'/');
      //目录清空后删除空文件夹
      @rmdir($path.$val.'/');
     }else{
      //如果是文件直接删除
      unlink($path.$val);
     }
    }
   }
  }
  }
    //比较版本号
    $fwqwz = 'https://cx.dzbfsj.com/admin-kzh/version.php'; 
    $fwqbb = file_get_contents($fwqwz);//获取服务器版本号
   echo '<h4>服务器最新版本为: '.$fwqbb.'</h4>'; 
   if ($bdbb==$fwqbb){
   echo '<br><h4><code>目前已是最新版本!</code></h4>';
   }else{
   echo '<br><h4><code>已有新版本,开始自动更新:</code></h4><br>';
     
  //下载升级包
   $url = "https://cx.dzbfsj.com/admin-kzh/upload/upload.zip";
   $save_dir = "down";
   $filename = "upload.zip";
   deldir('./down');//删除解压后存入的文件夹内所有文件,防止重名无法解压。
   $res = getFile($url, $save_dir, $filename, 1);  //Array ( [file_name] => upload.zip [save_path] => down/upload.zip )
   $filename = $res['file_name'];//文件名 upload.zip
   $zipfile = $res['save_path'];//路径 down/upload.zip
   echo '远程下载成功,开始解压升级包……<br>';
  //解压文件
   require_once('pclzip.lib.php');
     $zip = new PclZip($zipfile);//压缩文件的路径
     if ($zip->extract(PCLZIP_OPT_PATH, './down') == 0) {
        die("解压失败 : ".$archive->errorInfo(true));
     }else{
    echo '解压成功,开始升级系统!<br>';
    unlink($zipfile);//删除升级包
    xCopy("./down","../",1);//拷贝down下的文件到网站根目录,包括子目录 
	$myfile = fopen("version.php", "w") or die("down文件夹无法写入!");//修改版本号
	fwrite($myfile, $fwqbb);
	fclose($myfile); 
    echo '升级成功!<br>';
     }
   }


最后更新于:2019-10-19 00:47:23


上一篇: 如何人工解密js,只要谷歌浏览器就行

下一篇: 常用文件的后缀,上传时的文件类型


  • 最新评论(共0条)
需要登录才能发表评论

加入组织

  • QQ
  • 1. 手Q扫左侧二维码

    2. 搜Q群:617719749

    3. 点击加入学习群

最新评论