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上看下效果:

 

posted @ 2023-11-21 21:32  carol2014  阅读(121)  评论(0编辑  收藏  举报