zoukankan      html  css  js  c++  java
  • Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js

    一些理论知识

    先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一种压缩数据流的算法,任何需要流式压缩的地方都可以用。

    也就是说 zlib 格式, gzip 格式,是文件格式,deflate 是这些文件格式使用的压缩算法。

    传输方式

    deflate 压缩后是二进制,通常有两种传输方式:

    • 二进制
    • Base64编码

    二进制

    PHP

    // 压缩,注意:其中 ZLIB_ENCODING_DEFLATE 参数是不能少的
    $data = gzdeflate(json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 6, ZLIB_ENCODING_DEFLATE);
    
    // 使用 swoole 以二进制的方式发送
    $webSocket->push($fd, $data, WEBSOCKET_OPCODE_BINARY);
    

    JavaScript

    
    // 消息事件
    ws.onmessage = function(e) {
        // 转换前
        console.log(e.data);
        // 开始转换
        var blob = e.data;
        var reader = new FileReader();
        reader.readAsBinaryString(blob);
        reader.onload = function (evt) {
          var data = pako.inflate(evt.target.result, { to: 'string' })
          // 转换后
          console.log(JSON.parse(data))
        };
    };
    

    Base64编码

    通常在 WebSoctet 不会使用这种方法,但是在接口或其他文本传输中会使用到。

    PHP + JavaScript

    
    <script type='text/javascript'>
    const compressedDEFLATE = '<?php echo base64_encode(gzdeflate('Compress me', 6, ZLIB_ENCODING_DEFLATE )); ?>';
    function atos(arr) {
        for (var i=0, l=arr.length, s='', c; c = arr[i++];)
            s += String.fromCharCode(
                c > 0xdf && c < 0xf0 && i < l-1
                    ? (c & 0xf) << 12 | (arr[i++] & 0x3f) << 6 | arr[i++] & 0x3f
                : c > 0x7f && i < l
                    ? (c & 0x1f) << 6 | arr[i++] & 0x3f
                : c
            );
        return s
    }
    console.log(atos(pako.ungzip(atob(compressedDEFLATE))));
    </script>
    

    Swoole WebSoctet 框架

    安利一个基于 Swoole 的 WebSoctet 开发框架: MixPHP

    原文地址:https://segmentfault.com/a/1190000016547663

  • 相关阅读:
    排序算法整理
    V-REP Plugin 开发
    YAML-CPP
    YAML
    V-REP Remote API
    V-REP Plugin
    结构化方法与面向对象方法的比较
    敏捷软件开发vs传统软件工程
    个人项目-地铁出行路线规划程序
    Week1个人作业
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9969021.html
Copyright © 2011-2022 走看看