服务端和客户端如何优化数据传输_优品建站

服务端和客户端如何优化数据传输

  对于移动互联网应用来说,需要通过网络在服务端和客户端之间传输数据。因此,如果数据传输过程不通畅,必然会影响到整个系统的运行效率。如果是这样,就算服务端的运行速度再快,用户也会觉得应用响应很慢,所以数据传输过程的优化也是服务端优化中非常重要的一环。
一. 优化JSON协议
  我们知道,在通信协议的通用设计原则中,通用性和简洁性是最重要的,关于这两点的详细解释请参考4.6节。简洁性就不多说了,JSON协议的结构和语法都要比其他文本协议简洁很多,所以选择JSON协议作为微博应用通信协议的基础本身就是对系统的一种优化。另外,在设计JSON消息时注意保证消息字段名简短、清晰,下面我们主要介绍如何保证协议的通用性。
  通过第6章对服务端API接口逻辑代码的分析,我们知道在所有服务端接口的逻辑中,都会调用render方法来打印结果的JSON数据,而此方法就是对协议通用性的一个保证,使用统一的方法处理消息有利于对JSON数据的控制,接下来我们观察此方法的代码实现,如代码清单9-5所示。
代码清单 9-5
class Demos_App_Server extends Hush_Service
{
  ... 
  public function render ($code, $message, $result = '')
  {
        // 处理result数据
        if (is_array($result)) {
              foreach ((array) $result as $name => $data) {
                    // 处理对象数组
                    if (strpos($name, '.list')) {
                          $model = trim(str_replace('.list', '', $name));
                          foreach ((array) $data as $k => $v) {
                              $result[$name][$k] = M($model, $v);
                          }
                    // 处理单个对象
                    } else {
                          $model = trim($name);
                          $result[$name] = M($model, $data);
                    }
              }
        }
        // 打印JSON数据
        echo json_encode(array(
              'code'            => $code,
              'message'         => $message,
              'result'          => $result
        ));
        exit;
  }
  ... 
}
  从上述代码中可以看出,render方法的主要逻辑都在处理$result变量,也就是JSON数据中的result字段。程序循环获取$result数据中的键名(key)和数值(value),并按照微博应用通信协议的设计,通过判断键名的格式(模型名.list表示对象数组)来分别处理单个对象和对象数组的逻辑。另外,这里还用到了M方法来格式化模型的数据。此方法与数据模型的定义放在一起,即etc/目录下的global.datamap.php文件中,如代码清单9-6所示。
代码清单 9-6
// 数据模型数组
$_DataMap = array(
  'Customer' => array(
        'id' => 'id',
        'sid' => 'sid',
        'name' => 'name',
        'sign' => 'sign',
        'face' => 'face',
        'faceurl' => 'faceurl',
        'blogcount' => 'blogcount',
        'fanscount' => 'fanscount',
        'uptime' => 'uptime',
  ),
  ... 
);
// 格式化数据模型
function M ($model, $data)
{
  global $_DataMap;
  $dataMap = isset($_DataMap[$model]) ? $_DataMap[$model] : null;
  if ($dataMap) {
         $dataRes = array();
         foreach ((array) $data as $k => $v) {
                  if (array_key_exists($k, $dataMap)) {
                      $mapKey = $dataMap[$k];
                      $dataRes[$mapKey] = $v;
              }
}
        return $dataRes;
  }
  return $data;
}
  通过分析,我们可以看出M方法实际上就是根据$_DataMap数组中的模型定义来格式化JSON数据返回,通过此方法处理返回的数据一定会满足$_DataMap中的模型定义,这样就保证了JSON返回数据的正确性,就算我们在程序中写错了某个消息字段,也不会在返回的JSON数据中出现,这也从某种角度上保证了JSON协议的通用性。
虽然,以上逻辑会有一定的计算量,但是为了保证系统的稳定和安全,这点系统资源消耗还是非常值得的。
二. 使用gzip压缩
  优化数据传输除了要对数据本身进行优化,也就是前面介绍的关于JSON协议的优化,还需要对传输过程进行优化。数据从服务端到客户端的过程需要通过复杂的网络,因此影响数据传输的因素主要有两个,其一是网络质量,如果网络本身出了状况,必然会造成通信速度缓慢的问题,网络优化相关内容可参考9.3.3节;其二是数据本身的大小,数据越大传输速度必然越慢,因此能否对数据进行合理的压缩就成了本节需要讨论的问题。
  对于HTTP协议来说,gzip是目前最主流的压缩算法之一,大部分的HTTP服务器都支持这种压缩算法,对于文本消息来说,gzip算法大约可以减少70%以上的数据尺寸。通过实际项目的压力测试结果来看,对传输数据进行压缩之后不仅会极大地缩短请求响应时间,还可以大幅度地提高服务端的承载能力。
  本书微博服务端使用的是Xampp服务套件,其中HTTP服务器是Apache。接着就来介绍如何为Apache服务器配置gzip压缩功能模块。首先,我们可以使用“httpd-M”命令来查看已经安装的模块,如果没有找到deflate_module模块则需要先在Apache根目录的conf/httpd.conf配置文件中将“LoadModule deflate_module modules/mod_deflate.so”这行注释打开,并重启服务器。
  当然,并不是所有的文件都需要压缩的,某些类型的文件压缩起来反而效率比较低,比如图片、PDF文档等;原因是这些文件本身已经被压缩过了,用gzip再压缩一次并不能减小文件的大小,反而增加了系统运算量的开销。所以,在Apache配置文件中我们可以通过设置把这些文件排除掉。配置示例如代码清单9-7所示。
代码清单 9-7
<IfModule deflate_module>
  SetOutputFilter DEFLATE
  # 不压缩图片以及其他类型
  SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
  SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
  SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary
  # 压缩脚本和文本类型文件
  AddOutputFilterByType text/html text/css text/plain text/xml
  AddOutputFilterByType application/javascript application/x-javascript
</IfModule>
  除了Apache,Nginx也是如今非常流行的HTTP服务器,如果配合PHP的FastCGI模式提供服务效率应该不低于Apache加mod_php的运行模式。这里也随带介绍一下如何为Nginx服务器配置gzip压缩功能。我们需要知道,Nginx的gzip压缩功能默认是关闭的,并且只对text/html文件进行压缩,配置示例如代码清单9-8所示。
代码清单 9-8
gzip                 on;
gzip_min_length      1024;
gzip_proxied         expired no-cache no-store private auth;
gzip_types           text/plain application/x-javascript text/css text/html application/xml;
  gzip的值on或者off分别代表开启或者关闭gzip压缩功能。gzip_min_length设置需要压缩页面的最小字节数,该值会从header头中的Content-Length中获取,而且默认值是0,即不管页面多大都进行压缩。gzip_proxied配置仅在Nginx作为反向代理时使用,这里不作详细介绍。gzip_types代表的是需要压缩文件的MIME类型,当然无论是否指定,“text/html”类型总是会被压缩的。
  使用gzip压缩传输方案还需要客户端的配合,发送请求时需要带上gzip相关的HTTP请求头,接收到压缩数据时还需要进行解压,至于客户端的代码实现,我们可以在7.3.1节中找到相关的内容。

  • 网站制作的基础:版面设计与内容的有效结合
    随着互联网的发展,网站制作的版面设计变得越来越重要。访问者不想再看到只提供内容的网站。虽然内容很重要,但是只有把网站做好了,把网站的内容与版面设计有效结合起来,这种网站和站点才容易被人接受。
  • javascript实践案例:网页计算器
    网页计算器在Web开发中是很常见的功能。下面利用JavaScript中的函数,完成整数加、减、乘、除的运算,实现一个简易版的计算器。
  • 网站设计制作关键环节就是确定网站界面
    界面就是网站给浏览者的第一印象,往往决定着网站的可看性,在确定网站的界面时要注意以下三点:1.栏目与板块编排,2.目录结构与链接结构,3.进行形象设计。
  • 集成基于Promise的工具及Promise的用法
    我们要解释一下最后一条规则“如果一个工具会返回Promise,那么你就不需要这个工具的插件”,以免你还没听说过Promise。总体而言,Promise是一种用同步的方法来处理异步结果的方法。听起来很难懂?好吧,也许是有点。先剧透一下:Promise可以非常好地集成到Gulp task系统中
  • 网站建设如何选择和优化网站域名
    网站建设的第一步就是要注册域名,域名就相当于是实体店的地址,选址非常的重要。那么如何去选择域名更有利于网站优化和推广呢?本文就向大家详细介绍选择域名需要注意那些事项。
  • 网站制作具体流程及六大步骤是什么?
    网站制作是一个综合性极强的工作,涉及到商业策划、平面设计、人机界面、程序语言和数据库等,本文介绍网站制作六大步骤。
  • uniapp实现多端开发, PHP写api接口的一些注意事项与安全策略
    市面上很多关于多端开发的框架,比较常用,流行的框架 uni-app,Chameleon(变色龙),taro这些,都可以支持多端,一套代码,8个平台支持。
  • 房地产类网站制作报价内容明细
    本文主要介绍房地产类网站制作报价的内容和模板,包括移动端和pc端页面的设计和功能的开发。
  • 网站制作都包括那些费用,网站制作报价明细一览
    在各个地区很多中小型的实体企业很想给自己的公司创建一个网站来展示自己,因此就寻找当地开发公司来制做,但如何选择呢?网站制作的价格是这么订的?都包括那些费用呢?下面我们就介绍一下网站建设价格都包括那部分。
  • 公司制作一个优质官方网站需要多少钱?
    建站公司很多,企业不知如何选择,各家建站公司的报价也没有统一的规范。选贵的,觉得不划算,没必要;如果选择便宜的,就会有各种各样的后顾之忧。其实价格的高低并不能决定建站的质量,最重要的是要注意选择合适的建站公司。因为每个建站公司的收费规范都不一样,下面就给大家分析一下建站的费用。
  • 网站制作 服务

    免费网站制作报价,免费优化,1对1服务,个性化定制服务

    pc和wap网站制作

    多年建站经验,上千个成功案例,
    为您提供一站式服务

    网站维护改版

    大厂经验工程师对现有网站进行
    改版,修复,维护。

    小程序制作

    微信小程序,支付宝小程序,
    百度小程序

    响应式网页设计

    响应式网页设计可以与多种设备兼容,
    如智能手机,平板电脑和PC