# PHP+JS(pako)前后端數據壓縮,節省帶寬方案
## **一、準備工具**
### **1.pako腳本庫**
github地址:https://github.com/nodeca/pako
### **2.前端Uint8Array與Base64互轉函數(代碼如下)**
~~~
//?uint8array轉為base64字符串
function?uint8arrayToBase64(u8Arr)?{
????let?CHUNK_SIZE?=?0x8000;?//arbitrary?number
????let?index?=?0;
????let?length?=?u8Arr.length;
????let?result?=?'';
????let?slice;
????while?(index?<?length)?{
????????slice?=?u8Arr.subarray(index,?Math.min(index?+?CHUNK_SIZE,?length));
????????result?+=?String.fromCharCode.apply(null,?slice);
????????index?+=?CHUNK_SIZE;
????}
????//?web?image?base64圖片格式:?"data:image/png;base64,"?+?b64encoded;
????//?return??"data:image/png;base64,"?+?btoa(result);
????return?btoa(result);
}
//?base64字符串轉為uint8array數組
function?base64ToUint8Array(base64String)?{
????let?padding?=?'='.repeat((4?-?base64String.length?%?4)?%?4);
????let?base64?=?(base64String?+?padding)
????????.replace(/\-/g,?'+')
????????.replace(/_/g,?'/');
????let?rawData?=?window.atob(base64);
????let?outputArray?=?new?Uint8Array(rawData.length);
????for?(var?i?=?0;?i?<?rawData.length;?++i)?{
????????outputArray[i]?=?rawData.charCodeAt(i);
????}
????return?outputArray;
}
~~~
## **二、具體用法案例**
### **1.前端JS壓縮+后端PHP解壓**
### JS壓縮
~~~
// JS壓縮,注意:需要引入dist/pako_deflate.js(僅支持壓縮)或dist/pako.js(支持壓縮和解壓)
var?rawData?=?{title:"this?is?pako.defalte?test",author:?
"slongzhang@qq.com",?date:?"2021-04-02",?content:?"test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?test
"}
var?binaryString?=?pako.deflateRaw(JSON.stringify(rawData),?{?to:?'string'?});
var?compressedBase64??=?uint8arrayToBase64(binaryString);
console.log(compressedBase64);//?q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA
~~~
PHP解壓
~~~
//?PHP解壓
$base64String?=?'q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dI
fCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA';
print_r(gzinflate(base64_decode($base64String)));
~~~
###
### **2.后端PHP壓縮+前端JS解壓**
PHP壓縮
~~~
//?php壓縮
$array?=?array(
??"title"???????=>?"this?is?pako.defalte?test",
??"author"??????=>?"slongzhang@qq.com",
??"date"????????=>?"2021-04-02",
??"content"???????=>?"test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test?test?test?test?test?test?test?test?test?test?test?test?test
?test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test?test?test?test?test?test?test?test?test?test?test?test?test?
test?test"
);
function?compress($str)?{?return?base64_encode(gzdeflate($str,?9));?}
echo?compress(json_encode($array,256));
//?q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8d
//IfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA
~~~
###
### JS解壓
~~~
// JS解壓,注意:需要引入dist/pako_inflate.js(僅支持壓縮)或dist/pako.js(支持壓縮和解壓)
var?decompress?=?function(str){
????return?pako.inflateRaw(base64ToUint8Array(str),?{to:?'string'});
}
var?rawData?=?decompress('q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz
8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA'
);
console.log(rawData);
~~~
數據壓縮對比可達8倍

**三、注意事項**
**1.前端JS**
必須引入Uint8Array與Base64互轉函數
如果不需要同時處理壓縮和解壓可按需單獨引入腳本pako\_deflate.min.js(壓縮)| pako\_inflate.min.js(解壓);

如果需要同時處理壓縮和解壓那么請直接引入pako.js
###
### **2.PHP要求(PHP 5.6, PHP 7, PHP 8)**
**原文鏈接:https://mp.weixin.qq.com/s/qoYd1SxOVOdipaXLjux8-g**
- PHP書寫規則
- 代碼縮進
- 大括號{ }書寫規則
- 變量賦值對齊
- if條件判斷規范
- 避免嵌入式賦值
- 函數和方法的注釋
- 項目規范
- 業務邏輯logic
- model模型
- 控制器
- view視圖
- 定制項目開發
- 接口輸出變量格式
- mysql設計規范
- 二維碼系列
- php 用phprqcode 生成簡單的二維碼
- 小程序二維碼
- 其他小工具
- 獲取單個漢字拼音首字母
- js 調起打印多出一張空白的問題?
- php 2張圖片合拼
- 判斷一個漢字可以等于1個字符,2個字符,3個字符
- 微信小程序獲取頁面路徑
- 小程序js、canvas實現矩形圓角、圓形頭像圖片
- php phpMailer 發送郵件(親測有效)
- 系統配置表
- php 用tcpdf 生成pdf
- PHP mkdir():創建目錄
- php 通過svg動態生成生成后綴圖標
- php 本地安裝SSL證書
- php 生成首字母頭像
- php 接口數據壓縮返回,減少帶寬
- PHP向二維數組多維數組追加相同元素
- php 指定時間戳上加上一天,一個月,一年的方法
- Spreadsheet 表格生成
- php 多維數組排序 多維數組按照某個字段排序
- php根據開始和結束時間獲取期間日期
- php 獲取本周、上周、本月、上月及指定時間所在周、月的起止時間
- php GeoIP2通過ip獲取國家和地區城市
- 奇葩報錯問題
- session賦值報錯
- 服務器配置lnmp
- 開啟mysql binglog 日志
- lnmp 開啟遠程訪問3306
- 開啟mysql 慢日志查詢
- 開通Liunx 3306 端口(遠程連接開放)
- 搭建lnmp
- liunx 多臺服務器搭建共享文件夾圖片文件夾
- liunx 操作命令1
- nginx專區
- 禁止外部ip訪問
- 強制跳轉到https
- mysql專區
- 版本5.7報錯 only_full_group_by
- 把同一張表的一個字段的內容復制到另一個字段里
- lnmp關閉嚴格模式
- mysql 兩張不同結構的表連表查詢,合并,并分頁,排序 教你如何實現UNION
- mysql 查詢一張表中某個字段不同狀態的數量統計
- mysql數據庫快速插入百萬條級別的測試數據
- MySQL EXPLAIN 詳解,可用EXPLAIN來分析優化數據庫sql語句
- mysql 三星索引
- mysql 返回數據排名查詢獲取排名的方法,親測有效
- mysql使用查詢出來的值并且更新update新的表報錯?叫你一招
- mysql 怎樣自定義in查詢操作排序
- mysql 百萬級別和千萬級數據分頁查詢性能優化
- mysql 查詢某個字段按照逗號分割返回
- mysql 用sql命令導入數據庫
- mysql 根據某個字段的值匹配替換某個值
- Mysql中分組后取最新的一條數據排序
- Certbot-免費的https證書
- session_start()報錯問題
- 文件大打不開?代碼實現分割
- windows服務器專區
- apache 突然重啟動不了
- windows 定時任務
- liunx專區
- liunx 定時器檢查php是否能訪問,重啟
- liunx 操作命令
- 定時器 tp5 命令行
- liunx查看端口是否開放
- liunx上傳或者下載本地文件
- 前端
- jq克隆html
- Jquery添加元素(append,prepend,after,before四種方法區別對比)
- 小程序switch樣式修改
- css div 里面模塊 平均展開
- 安全小學堂
- 驗證碼一次一碼
- 實戰thinkphp6
- 前言
- 中間件
- 開啟多語言
- RabbitMQ 專區
- 下載RabbitMQ
- ftp專區
- Linux安裝vsftpd及配置詳解
- 小程序欄目
- 微信小程序封裝統一接口請求api數據
- 云數據庫
- 小程序云開發更新云函數數組的某一項,并且某個是變量代替
- php面試總結
- Mysql面試
- PHP面試知識
- Thinkphp框架小知識
- fastadmin 文檔
- fastadmin js 渲染 動態下拉(SelectPage)組件
- fastadmin 列表搜索欄 支持三級聯動 地區選項
- fastadmin searchList組件自定義數據返回
- 開發工具
- phpstorm 一直在Indexing,一直加載索引,無法正常使用
- PHP專區
- session 工作流程
- Redis
- php redis 基本操作
- SourceTree 3.3.9跳過注冊安裝
- composer 專區
- 手把手教你寫一個composer包
- freessl證書申請