成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

php如何實現(xiàn)更新功能

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

php如何實現(xiàn)更新功能

推薦:《PHP視頻教程》

php 實現(xiàn)一個簡單的項目升級功能

思路

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

2.升級包上傳驗證上傳文件,驗證當(dāng)前系統(tǒng)版本

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

4.記錄升級日志,返回升級進(jìn)度

5.升級包應(yīng)該是加密的(暫時沒實現(xiàn))

說明

1.升級包的目錄結(jié)構(gòu)必須如下

/**  *  升級包規(guī)定的目錄結(jié)構(gòu)  *  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"; //系統(tǒng)升級日志     public $return_log = "/tmp/web/return_log.log"; //系統(tǒng)回滾日志     public $progress_log = "/tmp/web/progress_log.log"; //記錄進(jìn)度     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';//當(dāng)前系統(tǒng)的版本 這個在實際應(yīng)用中應(yīng)該是蟲數(shù)據(jù)庫獲取得到的,這里只是舉個例子     /** 展示升級界面 */     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%");         //執(zhí)行升級         $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更新失敗");                 //數(shù)據(jù)庫回滾                 if(file_exists($this->upload_dir.'/'.$package_name."/mysql/mysql_rockback.sql"))                 {                     $this->save_log("數(shù)據(jù)庫回滾");                     $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%");         //更新系統(tǒng)的版本號了        //更新php的版本號了(應(yīng)該跟svn/git的版本號一致)        //更新數(shù)據(jù)庫的版本號了(應(yīng)該跟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 要確定系統(tǒng)是否已經(jīng)安裝         $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;         }         //這里還可以對備份的文件進(jìn)行壓縮         return true;     }     /**      * 數(shù)據(jù)庫操作      */     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"=>"數(shù)據(jù)庫操作OK"];     }     /**      * 返回系統(tǒng)升級的進(jìn)度      */     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)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
无码国产精品一区二区免费式直播 | 韩国善良的小峓子在钱| 国产女人乱子对白AV片| 黑人巨大精品欧美| 久久精品国产亚洲AV忘忧草18| 麻豆国产尤物AV尤物在线观看| 欧美黑人一级二级巨大久久天堂 | 乱子伦农村XXXXBBB| 欧美丰满美乳XXⅩ高潮www| 日本又黄又爽GIF动态图| 玩弄朋友娇妻呻吟交换电影| 亚洲国产成人精品无码区在线播放 | CAOPOREN免费精品视频| 粉嫩av一区二区精品爆乳| 国产日韩AV免费无码一区二区三| 九九精品国产亚洲AV日韩| 妺妺窝人体色WWW聚色窝仙踪| 日产乱码一二三区别免费必看| 无码熟妇人妻AV在线网站| 亚洲性XXXXX极品少妇| CHINA末成年VIDEOS| 国产AV无码精品色午夜| 饥渴人妻被快递员玩弄的视频| 美女裸体A级毛片| 日韩人妻无码一区二区三区视频| 午夜福利1000集合集92| 荫蒂每天被男人添| 丰满人妻妇伦又伦精品App抖| 精品 亚洲 无码 自拍 另类| 男生晚上睡不着想看B站| 天天做AV天天爱天天爽| 亚洲一卡2卡3卡4卡5卡6卡| 扒开校花的粉嫩小泬| 国产亚洲人成在线视频网站| 免费A级毛片无码A∨蜜芽按摩 | 国产乱子伦高清露脸对白| 久久人人爽人人人人爽AV| 日韩AV无码中文无码不卡电影 | 国产精品久久久久久久福利| 久久婷婷五月国产色综合| 日韩一区二区三区无码影院| 亚洲成A人片在线观看无码不卡 | 亚洲中文字幕久久精品蜜桃| 成 人 A V天堂| 久久99久久99小草精品免视看| 欧洲无人区码SUV| 亚洲AV最新在线观看网址下载| FREE MOVIES 日本护| 韩漫漫画无遮挡免费| 欧美日韩视频在线第一区 | 国内久久婷婷五月综合欲色广啪 | 久久精品AⅤ无码中文字字幕重口 久久精品AⅤ无码中文字字幕蜜桃 | 国产精品视频一区国模私拍| 男女啪啪永久免费网站| 性XXXⅩ俄罗斯女人| CHINA末成年VIDEO学生| 好大好厉害我接了一个顾客| 人妻少妇精品视频aaa| 亚洲日韩亚洲另类激情文学| 公与2个熄乱理在线播放| 美日韩一区二区三区| 性欧美大战久久久久久久| HENNESSY女RAPPER| 精品一区二区三区无码免费视频| 色诱视频在线观看| 中文日产无乱码AV在线观 | 儿子比老公更大更硬朗| 裸体跳舞XXXX裸体跳舞| 羞羞漫画AⅤ漫画AV漫画视频| かしこまりました中文在线 | 日本大学SGU大二大三| 亚洲尤码不卡AV麻豆| 国产成人AV乱码免费观看| 欧美成人精品一区二区综合| 亚洲欧美日韩精品色XXX| 国产白浆喷水在线视频| 欧美人与牲禽动交精品| 亚洲午夜无码极品久久| 国产免费一区二区三区免费视频| 强被迫伦姧在线观看中文版| 亚洲一区无码中文字幕乱码| 国产麻花豆剧传媒精品免费 | 国产成年无码V片在线| 欧美人与动牲交A欧美精品Z| 亚洲中文无码永久免| 国产午夜无码视频在线观看 | 国产94在线 | 亚洲| 欧美黑人粗暴多交高潮水最多| 亚洲熟妇在线观看| 韩国青草自慰喷水无码直播间| 孰妇XXXXXX的性生话| GOGO少妇无码肉肉视频| 麻花传媒0076在线观看| 亚洲男男GAY 18自慰网站| 国产三级多多影院| 熟女少妇内射日韩亚洲| 被绑在机器上强行高潮H| 末发育女AV片一区二区| 亚洲一区波多野结衣在线APP| 韩国19禁床震无遮掩免费| 偷偷鲁2019丫丫久久| 大地琪琪网在线观看| 全部免费毛片在线播放| 7777久久亚洲中文字幕蜜桃| 久热爱精品视频线路一| 亚洲性无码AV在线DVD| 狠狠色噜噜狠狠狠狠97| 亚洲AⅤ精品无码一区二区| 国产福利一区二区三区在线观看| 日本熟妇人妻XXXXX人电影| APPSTORE美区免费| 农村妇女野外交性高清片| 在线精品免费视频无码的| 久久久亚洲精品无码| 亚洲欧美一区二区成人片| 好硬好湿好爽再深一点动态图片 | 天天影视色香欲综合久久| 大象大象视频WWW在线观看| 人人做人人爽人人爱| OLDMACDONALD老人大包| 欧美人伦禁忌DVD| 99热亚洲色精品国产88| 农村人乱弄一区二区| 2019午夜福利不卡片在线| 男女作爱在线播放免费网站| 2020久久国产综合精品SWA| 蜜桃AV自慰久久久久免费网站| 在线观看4480私人影视| 毛茸茸的撤尿正面BBW| 18禁网站在线永久免费观看| 免费无码的AV片在线观看| 999精产国品一二三产区区| 欧美日本国产VA高清CABAL| JAPONENSISFES中国| 人妻无码久久一区二区三区免费| 被按摩的人妻中文字幕BD| 日韩AV毛片无码免费| 丰满的人妻沦为玩物在线| 天天干天天射天天操| 国产剧情麻豆女教师在线观看| 无码国产精品一区二区免费式影视| 国产精品原创AV片国产日韩| 亚欧乱色熟女一区二区三区| 狠狠躁天天躁无码中文字幕图| 亚洲精品无码久久久久AV麻豆| 久久精品国产一区二区三| 真实国产乱子伦沙发睡午觉| 欧美黑人性暴力猛交高清| 成人国内精品久久久久影院| 色欲香天天天综合网站无码| 国产精品V欧美精品∨日韩| 亚洲AV日韩精品久久久久久| 精品无码日韩一区二区三区不卡| 亚洲中文字幕无码中文| 欧美国产日本高清不卡| 成人免费无遮挡在线播放| 脱了老师内裤猛烈进入的软件| 国外免费IPHONE网站| 夜夜高潮夜夜爽夜夜爱爱| 女少18XⅩXX性XXXXHD| 成人无码黄动漫在线播放| 无码人妻ΑⅤ免费一区二区三区| 狠狠97人人婷婷五月| 在线播放免费人成毛片试看| 欧州一级 片内射AV| 国产成人无码AV片在线观看不卡| 亚洲AV无码成人专区| 久久亚洲精品人成综合网| YYYY1111111午夜少妇| 偷拍激情视频一区二区三区| 精品少妇人妻AV一区二区| 51福利国产在线观看午夜天堂 | 亚洲欧美另类久久久精品| 妺妺晚上扒我内裤吃我精子H| 成在人线AV无码免费高潮水老板 | 锕锕锕锕锕WWW湿透了10秒 | 国产精品毛片无码一区二区蜜桃| 亚洲欧洲日产国码无码AV喷潮 | AE射频电源成色| 玩弄丰满熟妇XXXXX性60| 久久精品国产99国产精品澳门| CHINESE妓女野外直播| 婷婷久久综合九色综合97最多收 | 国产伦久视频免费观看视频 | 丁香色欲久久久久久综合网| 亚洲爆乳成AV人在线蜜芽| 男女啪啪吃奶GIF动态图| 国产AV导航大全精品| 亚洲中文字幕无码AV正片| 人妻熟妇女的欲乱系列| 国产无套码AⅤ在线观看| 中文字幕乱码人妻综合二区三区| 色欲色香天天天综合WWW| 精品欧洲AV无码一区二区| XXXCHINESE国产HD| 亚洲AV无码一区二区乱子伦| 欧美黑人一级二级巨大久久天堂| 国产麻豆剧果冻传媒星空视频| 77色午夜成人影院综合网| 西西4444WWW大胆无码|