php压缩json数据
最近在优化一个页面:ajax请求异步数据,特定情况下,json数据达到100MB左右,仅数据传输时间就需要10-20s左右,简直太慢了。
检索资料看怎么压缩json数据
方法1:
使用ob_start回调函数ob_gzhandler来对数据进行压缩,Ajax接收到的是json数据
<?php ini_set('memory_limit', -1); ini_set('zlib.output_compression_level', 1); //设置压缩级别,默认6 ob_start('ob_gzhandler'); //压缩数据 header('Content-Type: application/json'); $data = []; for ($i = 0; $i < 3000000; $i++) { $data[] = ['name' => '中文a' . $i, 'age' => random_int(10, 99)]; } echo json_encode($data);
<script src="./plugins/jquery/jquery-3.6.0.min.js"></script> <script> $.ajax({ url: "http://localhost:3000/php-demos/test.php", method: "get", dataType: "json", success: function (res) { console.log(res); }, error: function (xhr, err) { console.log(err); }, }); </script>
方法2:
使用gzcompress()等函数进行压缩,ajax接收到文本数据,需进行转换处理
<?php ini_set('memory_limit', -1); $data = []; for ($i = 0; $i < 3000000; $i++) { $data[] = ['name' => '中文a' . $i, 'age' => random_int(10, 99)]; } $json = json_encode($data); // $json = gzdeflate($json, 1); $json = gzcompress($json, 1); // $json = gzencode($json, 1); $json = base64_encode($json); echo $json;
<script src="./plugins/jquery/jquery-3.6.0.min.js"></script> <script src="./plugins/pako.min.js"></script> <script> $.ajax({ url: "http://localhost:3000/php-demos/test-gz.php", method: "get", dataType: "text", success: function (res) { console.log(res); var strData = base64ToUint8Array(res); var data = JSON.parse(pako.inflate(strData, { to: "string" })); console.log(data); }, error: function (xhr, err) { console.log(err); }, }); // 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; } </script>
上面base64ToUint8Array算法来自网络
本地测试结果:
放到server上看下效果: