站長資訊網
        最全最豐富的資訊網站

        php如何實現更新功能

        php實現更新功能的方法:首先制作升級包,增量更新;然后驗證上傳文件,并驗證當前系統版本;接著備份原來的代碼,并當升級失敗時進行回滾;最后記錄升級日志,返回升級進度即可。

        php如何實現更新功能

        推薦:《PHP視頻教程》

        php 實現一個簡單的項目升級功能

        思路

        1.制作升級包,增量更新

        2.升級包上傳驗證上傳文件,驗證當前系統版本

        3.升級之前要先備份原來的代碼,升級失敗要進行回滾

        4.記錄升級日志,返回升級進度

        5.升級包應該是加密的(暫時沒實現)

        說明

        1.升級包的目錄結構必須如下

        /**  *  升級包規定的目錄結構  *  xxx_版本號.zip(如:xxx_1.0.0.zip)  *   |  *   |————mysql  *   |    |  *   |    |___mysql_update.sql(更新腳本)  *   |    |___mysql_rockback.sql(回滾腳本)  *   |      *   |____php  *  */

        2.mysql_update.sql

        create table test(id init(11)); create table test2(id init(11)); mysql_rockback.sql drop table test; drop table test2; 4.代碼 class UpgradeSys{     public $update_log = "/tmp/web/update_log.log"; //系統升級日志     public $return_log = "/tmp/web/return_log.log"; //系統回滾日志     public $progress_log = "/tmp/web/progress_log.log"; //記錄進度     public $root_dir = "/Users/feng/Documents/work/test"; //站點代碼的根目錄     public $aFile = ["log","runtime"];//忽略文件夾相對路徑     public $backup_dir = "/tmp/web/backup_dir";//備份目錄     public $upload_dir = "/tmp/web/upload_dir";//升級包目錄     public $sys_version_num = '1.0.0';//當前系統的版本 這個在實際應用中應該是蟲數據庫獲取得到的,這里只是舉個例子     /** 展示升級界面 */     public function index()     {         include("update.html");     }     /**      * 處理升級包上傳      */     public function upload()     {         $params = $_POST;         if($_FILES)         {             $name  = $_FILES['file']['tmp_name'];             if(!$name || !is_uploaded_file($name))             {                 echo json_encode(["status"=>0,"msg"=>"請上傳升級包文件"]);                 die;             }         }         //校驗后綴         $astr = explode('.',$name);         $ext = array_pop($astr);         if($ext != 'zip')         {             echo json_encode(["status"=>0,"msg"=>"請上傳文件格式不對"]);             die;         }         //校驗升級密碼         // if(!isset($params['password']) || $params['password'] != $this->password)         // {         //     echo json_encode(["status"=>0,"msg"=>"密碼錯誤"]);         //     die;         // }         //對比版本號         $astr = explode('_',$name);         $version_num = str_replace(".zip", '',array_pop($astr));         if(!$version_num)         {             echo json_encode(["status"=>0,"msg"=>"獲取版本號失敗"]);             die;         }         //對比         if(!$this->compare_version($version_num))         {             echo json_encode(["status"=>0,"msg"=>"不能升級低版本的"]);             die;         }         $package_name = $this->upload_dir.'/'.$version_num.'.zip';         if(!move_uploaded_file($name,$package_name))         {             echo json_encode(["status"=>0,"msg"=>"上傳文件失敗"]);             die;         }         //記錄下日志         $this->save_log("上傳升級包成功!");         $this->update_progress("20%");         //備份code         $result = $this->backup_code();         if(!$result)         {             $this->save_log("備份失敗!");             echo json_encode(["status"=>0,"msg"=>"備份失敗"]);             die;         }         $this->update_progress("30%");         //執行升級         $this->execute_update($package_name);     }     /**      * 升級操作      * @return [type] [description]      */     private function execute_update($package_name)     {         //解壓 如何使用zip加密壓縮,這里解壓縮的時候注意要解密         exec(" cd $upload_dir && unzip $package_name ");         $package_name = str_replace(".zip","",$package_name);         if(!is_dir($package_name))         {             $this->save_log("解壓失敗");             echo json_encode(["status"=>0,"msg"=>"解壓失敗"]);             die;         }         $this->update_progress("50%");         //升級mysql         if(file_exists($this->upload_dir.'/'.$package_name."/mysql/mysql_update.sql"))         {             $result = $this->database_operation($this->upload_dir.'/'.$package_name."/mysql/mysql_update.sql");             if(!$result['status'])             {                 echo json_encode($result);die;             }         }         $this->update_progress("70%");         //升級PHP         if(is_dir($this->upload_dir.'/'.$package_name.'/php'))         {             exec("cd {$this->upload_dir}/{$package_name}/php && cp -rf ./* $this->root_dir ",$mdata,$status);             if($status != 0 )             {                 $this->save_log("php更新失敗");                 //數據庫回滾                 if(file_exists($this->upload_dir.'/'.$package_name."/mysql/mysql_rockback.sql"))                 {                     $this->save_log("數據庫回滾");                     $this->database_operation($this->upload_dir.'/'.$package_name."/mysql/mysql_rockback.sql");                                   }                 //php代碼回滾                 $cmd = "cp -rf " .$this->backup_dir."/".$this->sys_version_num.'/'.basename($this->root_dir)."/* ".$this->root_dir;                 exec($cmd,$mdata,$status);                 $this->save_log("php回滾");                 echo json_encode(["status"=>0,"msg"=>"php更新失敗"]);                 die;             }         }         //把解壓的升級包清除         exec("rm -rf $upload_dir/$package_name ");                  $this->update_progress("100%");         //更新系統的版本號了        //更新php的版本號了(應該跟svn/git的版本號一致)        //更新數據庫的版本號了(應該跟svn/git的版本號一致)         echo json_encode(["status"=>1,"msg"=>"升級成功"]);         die;     }     /**      * 比較代碼版本      * @return [type] [description]      */     private function compare_version($version_num='1.0.0')     {                  return version_compare($version_num,$this->sys_version_num,'>');     }     /**      * 備份代碼      */     private function backup_code()     {         //rsync 要確定系統是否已經安裝         $cmd = "cd $root_dir && cd ..  && rsync -av ";         foreach ($this->aFile as $key => $value) {             $cmd ."--exclude ". basename($this->root_dir) ."/".$value ." ";         }         $cmd .= basename($this->root_dir)." ".$this->backup_dir."/".$this->sys_version_num;         exec($cmd,$mdata,$status);         if($status != 0)         {             return false;         }         //這里還可以對備份的文件進行壓縮         return true;     }     /**      * 數據庫操作      */     public function database_operation($file)     {         $mysqli = new mysqli("localhost","root","root","test");         if($mysqli->connect_errno)         {             return ["status"=>0,"msg"=>"Connect failed:".$mysqli->connect_error];         }         $sql = file_get_contents($file);         $a = $mysqli->multi_query($sql);         return ["status"=>1,"msg"=>"數據庫操作OK"];     }     /**      * 返回系統升級的進度      */     public function update_progress($progress)     {         exec(" echo '".$progress."' > $this->progress_log ");     }     /**      * 記錄日志      */     public function save_log($msg,$action="update")     {         $msg .= date("Y-m-d H:i:s").":".$msg."n";         if($action == "update")         {             exec(" echo '".$msg."' >>  $this->update_log ");         }else         {             exec(" echo '".$msg."' >>  $this->return_log ");         }     } }

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品成人| 囯产精品一品二区三区| 国产精品第12页| 久久久久99精品成人片| 热re99久久精品国产99热| 精品国产一区二区三区色欲| 亚洲国产精品丝袜在线观看| 国产三级精品久久| 99久久精品免费观看国产| 18国产精品白浆在线观看免费 | 四虎成人欧美精品在永久在线| 亚洲国产精品SSS在线观看AV| 日本精品视频在线观看| 国产精品人成在线观看| 最新国产精品亚洲| 欧美精品黑人巨大在线播放| 999精品在线| 99久久免费国产精精品| 91精品国产高清久久久久久io| 精品国产VA久久久久久久冰| 人妻少妇精品视频一区二区三区| 最新精品露脸国产在线 | 四虎永久在线精品884aa下载| 国产精品www| 国内精品一级毛片免费看| 国产精品分类视频分类一区| heyzo高无码国产精品| 国产精品久久久久国产A级| 国产精品无套内射迪丽热巴| 国产人妖乱国产精品人妖| 精品国产一区二区三区久久久狼| 久久亚洲日韩精品一区二区三区| 日韩精品无码一区二区三区 | 亚洲欧美激情精品一区二区| 亚洲精品成a人在线观看| 亚洲乱码日产精品a级毛片久久| 亚洲精品无码专区2| 亚洲国产精品福利片在线观看| 亚洲AV无码久久精品蜜桃| 久久亚洲国产成人精品性色| 国产精品无码成人午夜电影|