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);
返回结果: