天天看點

php打包zip解壓,備份還原資料庫

先說下需求吧:做的桌面管理軟體(不聯網,隻有更新時聯網),然後有更新版本需求,故用到的方法為:把開發完的代碼及環境一塊打包,通過curl下載下傳至本地某盤,通過解壓指令覆寫本地代碼及環境;但是資料庫線上下,也就是說必須先備份原資料在執行還原。

一、解壓打包zip

/**
 * 生成壓縮包
 * @param $files 數組:['d:/test/1.jpg', 'd:/test/2.jpg'] 檔案路徑絕對路徑
 * @param $filePath 輸出路徑 d:/test/new.zip
 * @return bool
 */
function goZip($files, $filePath)
{
    // 檢查參數
    if (empty($url) || empty($path)) {
        return false;
    }

    // 壓縮檔案
    $zip = new ZipArchive();
    $zip->open($filePath, ZipArchive::CREATE);
    foreach ($files as $key => $file) {
        // 檢查檔案是否存在
        if (!file_exists($file)) {
            return false;
        }
        // basename傳回路徑中的檔案名部分
        $zip->addFile($file, basename($file));
    }
    $zip->close();

    return true;
}
           
/**
 * 解壓zip
 * @param $filePath 壓縮包所在位址 【絕對檔案位址】d:/test/123.zip
 * @param $path 解壓路徑 【絕對檔案目錄路徑】d:/test
 * @return bool
 */
function unZip($filePath, $path)
{
    // 檢查參數
    if (empty($filePath) || empty($path)) {
        return false;
    }

    $zip = new ZipArchive();
    if ($zip->open($filePath) === true) {
        // 解壓中文亂碼
        $fileNum = $zip->numFiles;
        for ($i = 0; $i < $fileNum; $i++) {
            $statInfo = $zip->statIndex($i, ZipArchive::FL_ENC_RAW);
            $zip->renameIndex($i, iconv('GBK', 'utf-8//IGNORE', $statInfo['name']));
        }
        $zip->close();

        $zip->open($filePath);
        $zip->extractTo($path);
        $zip->close();
        return true;
    } else {
        return false;
    }
}
           

二、備份還原資料庫

/**
     * 備份資料庫
     */
    public static function sqlBack()
    {
        date_default_timezone_set("Asia/Shanghai");
        $dbUser   = 'root';
        $dbPwd    = 'This1020';
        $dbName   = 'db_jinan_bill';
        $fileName = 'bak';
        $name     = 'e:/' . $fileName . '.sql'; // 資料庫檔案儲存位置
        // 執行備份指令
        $exec     = 'e:/billV1.0/Extensions/MySQL5.7.26/bin/mysqldump -u' . $dbUser . ' -p' . $dbPwd . " " . $dbName . ' > ' . $name;
        // 執行指令
        exec($exec);
    }
           
/**
     * 還原資料庫
     */
    public static function sqlReduction()
    {
        date_default_timezone_set("Asia/Shanghai");
        $dbUser   = 'root';
        $dbPwd    = 'This1020';
        $dbName   = 'db_jinan_bill';
        $fileName = 'bak';
        $name     = 'e:/' . $fileName . '.sql'; // 資料庫檔案儲存位置
        // 執行備份指令
        $exec     = 'e:/billV1.0/Extensions/MySQL5.7.26/bin/mysql -u' . $dbUser . ' -p' . $dbPwd . " " . $dbName . ' < ' . $name;
        // 執行指令
        exec($exec);
    }
           

三、小細節

如果需要下載下傳線上的版本,那麼就要考慮到

curl 遠端下載下傳大檔案 我另一篇部落格也有教學:

https://blog.csdn.net/genziisme/article/details/114870675

資料庫備份還原也很早之前的一篇部落格有教學:

https://blog.csdn.net/genziisme/article/details/46517811

/**
 * curl遠端下載下傳大檔案
 * @param $url 遠端位址
 * @param $path eg:d:/test/123.zip 絕對路徑
 * @return boolean
 */
function downloadZip($url, $path)
{
    // 檢查參數
    if (empty($url) || empty($path)) {
        return false;
    }
    set_time_limit(0);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    // 忽略ssl證書
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    // 寫入
    $fp = fopen($path, 'w');
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);

    return true;
}