UpgradeLogic.php
7.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* Author: IT宇宙人
* Date: 2015-09-09
*/
namespace app\admin\logic;
use think\Model;
use think\Db;
class UpgradeLogic extends Model
{
public $app_path;
public $version_txt_path;
public $curent_version;
public $service_url;
/**
* 析构函数
*/
function __construct() {
$this->app_path = dirname($_SERVER['SCRIPT_FILENAME']).'/'; // 当前项目路径
$this->version_txt_path = $this->app_path.'application/admin/conf/version.php'; // 版本文件路径
$this->curent_version = file_get_contents($this->version_txt_path); // 记录版本的常量文件
$this->service_url = "http://service.tp-shop.cn/index.php?m=Home&c=Index&a=checkVersionTp5";
//$this->service_url = "http://service.tp-shop.cn/index.php?m=Home&c=Index&a=checkVersionTp52";
}
/**
* 检查是否有更新包
* @return type 提示语
*/
public function checkVersion() {
//echo "if(strtolower(".CONTROLLER_NAME.") == 'index' && strtolower(".ACTION_NAME.") == 'index')";
if(strtolower(CONTROLLER_NAME) == 'index' && strtolower(ACTION_NAME) == 'index')
{
// welcome index
// echo 'welcome index';
}else{
return false;
}
//error_reporting(0);//关闭所有错误报告
stream_context_set_default(array('http' => array('timeout' => 3)));
$url = $this->service_url."&v=".$this->curent_version; // http://service.tp-shop.cn/index.php?m=Home&c=Index&a=checkVersionTp5&v=v2.0.0
$serviceVersion = file_get_contents($url);
$serviceVersion = json_decode($serviceVersion,true);
if(count($serviceVersion) > 0)
{
return array(
0 => $serviceVersion['prompt1'],
1 => $serviceVersion['prompt2'], // 升级提示需要覆盖哪些文件
);
}
return null;
}
/**
* 一键更新
*/
public function OneKeyUpgrade(){
error_reporting(0);//关闭所有错误报告
$allow_url_fopen = ini_get('allow_url_fopen');
if(!$allow_url_fopen)
return "请开启 php.ini allow_url_fopen = 1";
$url = $this->service_url."&v=".$this->curent_version;
$serviceVersion = file_get_contents($url);
$serviceVersion = json_decode($serviceVersion,true);
if(count($serviceVersion) == 0)
return "没找到升级信息";
clearstatcache(); // 清除文件夹权限缓存
$quanxuan = substr(base_convert(@fileperms($this->app_path),10,8),-4);
if(!in_array($quanxuan,array('0777','0666','0222')))
return "网站根目录不可写,无法升级.";
if(!is_writeable($this->version_txt_path))
return '文件'.$this->version_txt_path.' 不可写,不能升级!!!';
// 下载文件
$result = $this->downloadFile($serviceVersion['down_url'],$serviceVersion['file_md5']);
if($result != 1) return $result;
$downFileName = explode('/', $serviceVersion['down_url']);
$downFileName = end($downFileName);
$folderName = str_replace(".zip","",$downFileName); // 文件夹
// 解压文件
$zip = new \ZipArchive();//新建一个ZipArchive的对象
if($zip->open($this->app_path.'backup/'.$downFileName)!=TRUE)
return "升级压缩文件读取失败!";
$zip->extractTo($this->app_path.'backup/');//假设解压缩到在当前路径下backup文件夹内
$zip->close();//关闭处理的zip文件
if(!file_exists($this->app_path.'backup/'.$folderName.'/www/application/admin/conf/version.php'))
return "缺少version文件,请联系客服";
if(file_exists($this->app_path.'backup/'.$folderName.'/www/application/database.php'))
return "不得修改db文件,请联系客服";
// 递归复制文件夹
recurse_copy($this->app_path.'backup/'.$folderName.'/www/',$this->app_path);
// 升级的 sql文件
if(count($serviceVersion['sql_file']) > 0)
{
foreach($serviceVersion['sql_file'] as $key => $val)
{
$sqlpath = $this->app_path.'backup/'.$folderName.'/sql/'.trim($val);
$execute_sql = file_get_contents($sqlpath);
//$execute_sql = iconv("gbk","utf-8//IGNORE",$execute_sql);
$execute_sql = explode(';', $execute_sql);
//print_r($execute_sql);
foreach($execute_sql as $k => $v)
trim($v) && Db::execute($v); // 遍历执行 升级sql语句
}
}
// 修改version.txt 文件
//file_put_contents($this->version_txt_path,$serviceVersion['to_key_num']);
// 删除下载的升级包
//delFile($this->app_path.'backup/'.$folderName);
// 推送回服务器 记录升级成功
$this->UpgradeLog($serviceVersion['key_num']);
// 这里写 推送回服务器代码
return 1;
}
/**
* @param type $fileUrl 下载文件地址
* @param type $md5File 文件MD5 加密值 用于对比下载是否完整
* @return string 错误或成功提示
*/
public function downloadFile($fileUrl,$md5File)
{
$downFileName = explode('/', $fileUrl);
$downFileName = end($downFileName);
$saveDir = dirname($_SERVER['SCRIPT_FILENAME']).'/backup/'.$downFileName; // 保存目录
if(!file_get_contents($fileUrl,0,null,0,1)){
return "下载升级文件不存在"; // 文件存在直接退出
}
$ch = curl_init($fileUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$file = curl_exec ($ch);
curl_close ($ch);
$fp = fopen($saveDir,'w');
fwrite($fp, $file);
fclose($fp);
if($md5File != md5_file($saveDir))
{
return "下载的文件有损害, 请重试!";
}
return 1;
}
// 升级记录 log 日志
public function UpgradeLog($to_key_num){
$vaules = array(
'domain'=>$_SERVER['HTTP_HOST'], //用户域名
'key_num'=>$this->curent_version, // 用户版本号
'to_key_num'=>$to_key_num, // 用户要升级的版本号
'time'=>time(), // 升级时间
'cpu'=>'0001', // 用户cpu信息 用于区分唯一标识
'mac'=>'0002', // 用户网卡信息用于区分用户唯一标识
'serial_number'=>SERIALNUMBER,
);
$url = "http://service.tp-shop.cn/index.php?m=Home&c=Index&a=upgradeLog&".http_build_query($vaules);
file_get_contents($url);
}
}
?>