php在线更新功能,一个主方法,一个文件下载方法
线上项目,实测,
public function update() { // 这里省略了版本判断逻辑,根据自己需要去写 // 更新包信息 $file_url = 'http://asd.com/v2.zip'; //更新包的下载地址 $filename = basename($file_url); //更新包文件名称 // 检查和创建文件夹 $dir = ROOT_PATH . "runtime/update/"; if (!file_exists($dir)) { mkdir($dir, 0777, true); } // 下载更新包到本地并赋值文件路径变量 $path = file_exists($dir.$filename)?$dir.$filename:$this->download_file($file_url,$dir,$filename); // 如果下载没成功就返回报错 if (!file_exists($dir.$filename)) { return json(["msg" => '文件下载失败!', "code" => 100]); } // PHP解压的扩展类 if(!class_exists("\ZipArchive")) return json(['code' => 100, 'msg' => '请安装ZipArchive扩展!']); // 实例化ZipArchive $zip = new \ZipArchive(); //打开压缩包 if ($zip->open($path) === true) { // 复制根目录,ROOT_PATH在入口文件已经定义了 $toPath = ROOT_PATH; try { // 解压文件到toPath路径下,用于覆盖差异文件 $zip->extractTo($toPath); // 必须销毁变量,否则会报错 unset($zip); // 删除更新包 unlink($path); } catch (\Exception $e) { return json(["msg" => "没有[" . $toPath . "]目录的写入权限", "code" => 100]); } //文件差异覆盖完成,开始更新数据库 if(file_exists(ROOT_PATH . "/sql.php")){ // 这里的数据库是.php文件,是可执行的php代码,不是.sql数据库文件,记住!!! include ROOT_PATH . "/sql.php"; chmod(ROOT_PATH . "/sql.php",0777); unlink(ROOT_PATH . "/sql.php"); } // 更新完成 return json(["msg" => "版本更新完成!", "code" => 200]); } else { // 压缩包打开失败,删除文件并且返回报错 unlink($path); return json(["msg" => "更新包解压失败,请重试!", "code" => 100]); } }
public function download_file($url, $dir, $filename = '') { if (empty($url)) { return false; } $ext = strrchr($url, '.'); $dir = realpath($dir); //目录+文件 $filename = (empty($filename) ? '/' . time() . '' . $ext : '/' . $filename); $filename = $dir . $filename; //开始捕捉 ob_start(); try { readfile($url); } catch (\Exception $e) { return json(["msg" => "文件下载失败,请联系开发人员!", 'code' => 100]); } $img = ob_get_contents(); ob_end_clean(); $size = strlen($img); $fp2 = fopen($filename, "a"); fwrite($fp2, $img); fclose($fp2); return $filename; }
来源地址:https://blog.csdn.net/weixin_45809825/article/details/126324633