php实现网站项目升级更新的思路

参考主流cms的思路:如织梦、phpcms、disucz。

大概流程如下:

1: 更新服务器指定目录需要一个每次升级的版本记录文件
例如格式: 更新日期,字符集,版本号,更新标题,更新文件的压缩包(压缩包内是更新需要的文件)
20140415,V5.7.41,20140415常规更新补丁,http://upgrade.diyi01.com/upgrade/upgrade-20140415.zip

2: 获取客户网站的最近更新日期,该日期可存于数据库或者文件)

3: 读取远程更新服务器更新文件信息,然后比对客户网站需要更新那些压缩包

4: 读取远程压缩包的配置文件(该文件记录压缩包内的文件列表),并根据\配置文件判断是否客户网站是否有写入权限,
如:
下载的文件临时存放在文件夹(../data/20140415)内,如果某些文件自己有改动导致更新中途中错,您可以从这文件夹提取文件手工更新。
本次升级需要在下面文件夹写入更新文件,请注意文件夹是否有写入权限:
../lib/ 状态:[√正常]
../lib/Article/ 状态:[√正常]
../Public/ 状态:[√正常]

5: 下载更新的文件到临时目录(可以直接下载压缩包在解压出文件)下载过程需要显示文件是否下载ok,完成提示安装更新按钮

6: 点击更新首先判断是否有sql文件,有先更新sql,在更新文件

7: 更新完成改写客户网站更新时间,并提示可以删除下载的临时更新文件

具体实施代码(需要考虑MD5比对):

php获取整个文件夹MD5:

<?php
/**
 * 工具文件
 * 最终目的在于比较两个文件夹的差异,
 * 
 * 但是本程序只用于得到一个目录的md5校验和,所以需要分别在不同机器上执行,然后比较md5校验和
 * 
 * 
 * 1)调用示例
 * php get_folder_md5.php /home/temp/2 
 * 
 * 2)我不想比.svn目录,所以程序中有$entry != ".svn",如果想彻底比较,请删除&& $entry != ".svn"
 * 3)
 * @author yyy
 */
//参数确定
if (count($argv) > 1 )
  $dir1 = del_postfix($argv[1]);
else 
  die('please input dir');
$global_str = md5('1');  
  
//检查第一个路径有,后者没有或错误的方法。
get_folder_md5($dir1);
echo "===========================================================\n";
echo $global_str;
echo "\n";
/**
 * 去除路径末尾的/,并确保是绝对路径
 *
 * @param unknown_type $dir
 * @return unknown
 */
function del_postfix($dir)
{
    if (!preg_match('#^/#', $dir)) {
        throw new Exception('参数必须是绝对路径');
    }
    $dir = preg_replace('#/$#', '', $dir);
    return $dir;
}
/**
 * 递归调用获取md5
 *
 * @param string $dir1        路径1,是标准
 */
function get_folder_md5($dir1){
    global $global_str;
    if (is_dir($dir1)) {
        $arr =  scandir($dir1);
        foreach ($arr as $entry) {
            if (($entry != ".") && ($entry != "..")  && ($entry != ".svn")){
                $new = $dir1."/".$entry; //$new是完整文件名或文件夹名
                //如果不想显示文件名可以注释下面这句
                echo $entry ."\n";
                $global_str = md5($global_str . $entry);
                if(is_dir($new)) {
                    get_folder_md5($new) ;
                } else { 
                    $global_str = md5($global_str . md5_file($new) );
                }
            }
        }
    }
}

php校验文件MD5:

<?php
/**
 * Created by PhpStorm.
 * User: kungyu
 * Date: 2015/12/11
 * Time: 15:13
 */
 
function check_file_md5($file1,$file2){
 
    $data['status'] = 2;
    $data['file_md5_1'] = md5_file($file1);
    $data['file_md5_2'] = md5_file($file2);
    $data['desc'] = "{$file1} 和 {$file2} 文件不相同";
 
    if($data['file_md5_1'] == $data['file_md5_2']){
        $data['status'] = 1;
        $data['desc'] = "{$file1} 和 {$file2} 文件相同";
    }
    return $data;
}
 
$dir = dirname(__FILE__);
$file1 = $dir.'/kung.doc';
$file2 = $dir.'/kung_bak.doc';
$file3 = $dir.'/kung_ba.doc';
$result = check_file_md5($file1,$file2);
var_dump($result);
$result = check_file_md5($file1,$file3);
var_dump($result);

返回结果:

黑侠网络,免费分享互联网!
我的主页 黑侠网络 » php实现网站项目升级更新的思路