標籤:rem 用戶端 page cto ack decode 響應 rect let
目前軟體開發主流越來越傾向於B/S模式,不同於C/S模式的軟體,B/S模式下的WEB程式自動更新是個麻煩問題。
本人利用PHP下載遠程檔案和ZIP類,寫了一個簡單的自動更新DEMO,供大家參考。
服務端目錄結構
|data |--20140918.zip|--index.php
其中 data 檔案夾用來存放補丁包,index.php 檔案用來響應版本資料給用戶端。
index.php
<?phpsleep(3);header(‘Content-Type:application/json;utf-8‘);echo json_encode(array( ‘20140918‘ => array( ‘version‘ => 20140920, ‘desc‘ => ‘BUG修正,緩衝系統‘, ‘url‘ => ‘http://‘ . $_SERVER[‘HTTP_HOST‘] . $_SERVER[‘REQUEST_URI‘] . ‘/data/20140918.zip‘ )));exit();
20140918 對應的是用戶端版本號碼,20140920 對應的是服務端版本號碼,desc 是本次補丁的描述,url 則是補丁包
用戶端目錄結構
|tmp|--config.php|--Zip.php|--index.php
config.php 為設定檔,儲存本地版本資訊,Zip.php 為ZIP操作類(從服務端下載的補丁包均為zip格式),index.php 為自動更新程式(只是為了方便,實際中可以寫個方法出來)
index.php
<?phpob_implicit_flush(true);$begin = microtime(true);//檢查更新,載入本地版本號碼$config = require(__DIR__ . ‘/config.php‘);$server = ‘http://localhost/version‘;echo ‘串連補救伺服器...<br/>‘;ob_flush();$versions = json_decode(file_get_contents($server), true);if (!isset($versions[$config[‘version‘]])) { echo ‘當前已是最新版本!‘;} else { echo ‘目前的版本:<b>‘, $config[‘version‘], ‘</b> 伺服器版本:<b>‘, $versions[$config[‘version‘]][‘version‘], ‘</b><br/>‘; ob_flush(); //開始下載 $remote_fp = fopen($versions[$config[‘version‘]][‘url‘], ‘rb‘); if(!is_dir(__DIR__.‘/tmp‘)) mkdir(__DIR__.‘/tmp‘); $tmp = __DIR__ . ‘/tmp/‘ . date(‘YmdHis‘) . ‘.zip‘; $local_fp = fopen($tmp, ‘wb‘); echo ‘開始下載...<br/>‘; ob_flush(); while (!feof($remote_fp)) { fwrite($local_fp, fread($remote_fp, 128)); } fclose($remote_fp); fclose($local_fp); echo ‘下載完成,準備解壓<br/>‘; ob_flush(); require(__DIR__ . ‘/Zip.php‘); $zip = new Zip(); $zip->extra($tmp, __DIR__); echo ‘解壓完成,準備刪除臨時檔案<br/>‘; ob_flush(); //刪除補丁包 unlink($tmp); echo ‘臨時檔案刪除完畢<br/>‘; ob_flush(); //更新本地版本號碼 $content = file_get_contents(__DIR__.‘/config.php‘); $content = str_replace($config[‘version‘],$versions[$config[‘version‘]][‘version‘],$content); file_put_contents(__DIR__.‘/config.php‘,$content); echo ‘更新完成!耗時‘,microtime(true) - $begin,‘秒<br/>‘; ob_flush(); ob_end_clean(); exit();}
config.php
<?phpreturn array( ‘version‘ => ‘20140918‘);
Zip.php
<?php/** * @version 1.0 * 壓縮、解壓縮類 */class Zip{ /** * 打包 * @param $path * @param $save */ public static function archive($path, $save) { $zip = new ZipArchive(); if ($zip->open($save, ZipArchive::OVERWRITE) === true) { self::addZip($path, $zip); $zip->close(); } } /** * 添加檔案或檔案夾到zip對象 * @param string $path * @param ZipArchive $zip */ private static function addZip($path, $zip) { $handler = opendir($path); while (($file = readdir($handler)) !== false) { if ($file != ‘.‘ && $file != ‘..‘) { if (is_dir($path . DIRECTORY_SEPARATOR . $file)) { self::addZip($path . DIRECTORY_SEPARATOR . $file, $zip); } else { $zip->addFile($path . DIRECTORY_SEPARATOR . $file); } } } closedir($handler); } /** * 解壓檔案 * @param string $file 壓縮檔路徑 * @param string $path 解壓路徑,為空白則以檔案名稱為路徑 */ public static function extra($file, $path = null) { if (!isset($path)) { $array = explode(‘.‘, $file); $path = reset($array); } $zip = new ZipArchive(); if ($zip->open($file) === true) { $zip->extractTo($path); $zip->close(); } }}
本文唯寫了一個很簡單的自動更新程式,只是為了說明更新程式的基本思路。還有很多細節方面可以定製的。
PHP自動更新網站