Posted on 2017 年 3 月 26 日 by Wadelau
这是 -gMIS 吉密斯 发布以来比较大范围的更新的一次,这篇文章也前后写了三周,一是忙,二是要记录的内容多,分别有如下几点:增加客户端、服务器端的缓存,增加压缩输出进行页面加载的提速,增加全局Session进行独立会话管理,增加新式的图形验证码方式,增加按照时间字段进行快速检索的功能等。备忘如下并分述之。
0. 提速:增加缓存支持,默认开启
0.1. 前端/客户端缓存
通过HTTP的Cache字段将页面中不经常修改的资源文件缓存在客户端,从而实现更快速的页面加载,这些资源文件包括JavaScript、CSS和图片Icon文件等。例如,在 HTTP Response 中增加这样的设置。
Cache-Control: max-age=604800
0.2. 网络层缓存(CDN)
通过将服务器端端页面内容缓存在距离终端用户较劲端ISP端的网络层,从而实现较快的访问,这超出编程的范围,将在另外的篇章讨论。
03. 后端/服务器端缓存
服务器端缓存是将从第三方资源提供方获得端资源缓存在本地,以内存热备的方式使得第二次同样资源可以较快方式获得。第三方资源包括读取文件系统、数据库系统、其他在线资源等。
-gMIS 的服务器端缓存,主要依靠 -GWA2 的缓存接口实现,其中的实现细节描述在 “-GWA2 更新缓存调用built-in cache方法”( -R/r2SH )。
-gMIS 服务器端端缓存主要缓存一些辅助设置端查询,如动态菜单、路径导航、对象表结构描述、select选项等不会即时改变,也不需要实时显示修改状态等数据,对于当前对象表的数据则不能进行缓存,这由于 -gMIS 管理信息系统的性质所决定的,增删改的动作需要即时反应出来。
页面缓存及提速的思维导图可以描述为下图所示。
(页面缓存及提速方式方法)
上述设置分别在 inc/config.class 中进行开关设置,默认开启,可以进行在线开启或关闭。
1. 优化:按时间检索快捷方式
增加按日期滚动的快捷检索方式。对于具有时间属性的对象表,此前提供了按月滚动管理的功能,也即总是按一定规则显示当前月份的数据表,而且在功能区增加对过去三个月的链接。
本次修改,进一步地对具有时间属性的对象表,提供针对时间属性的快捷检索方式,如按天的“今天”,“昨天”,“本周”和“上周”。
区分处理日期/时间戳。对于时间属性是按天或者按小时,按分钟的情况分别进行特别处理。
‘rotatespan’=>’rotatespan’, # table names contains variable datetime, e.g. _201412, _201501, Mon Jan 5 15:31:29 CST 2015
‘searchbytimefield’ => ‘searchbytimefield’ # provide timebased search buttons
2. 优化:增加自我独立Session的实现
减掉对外部/第三方session管理的依赖。经过多方实验,最终选择使用自身提供了一种使用全局携带sessionId(sid)的访问鉴权方式来实现安全认证及会话管理。由于目前需要动态管理的用户信息并不多,主要是当前用户端User Id,可以不依赖第三方会话Session进行管理。
在此之前,-gMIS 一直是临时使用PHP的内置Session进行会话管理,也即在页面的Header部分启用
session_start();
这种方式在单机实验阶段会运行良好,但在实际生产环境中或者在多个应用服务器组成的负载均衡中却无法使用,需要真实的第三方Session服务会话进行管理。
这次使用一种全局携带Session Id的方式实现Session 会话管理,这种方式在此前的应用中进行过部署,可以穿越各种网络环境,甚至是那种不能透传Cookie的网络环境,其健壮性较好。同时,也提供了基于Cookie的复用。
这样的改动,几乎需要在所有的页面所有的链接中修改增加Session Id,因此改动较大,同时修改后还需要逐个功能点点实际测试,涉及到的工作量挺多的。
3. 优化:探索使用基于单向Hash的图形验证码方式
不再依赖第三方存储信息的方式提供图形验证码服务。这个思路与上一点类似,想彻底摆脱对外部第三方Session会话的管理。传统地对人机验证作为会话管理的一部分,需要先生成问题/答案,存储在Session会话服务器上,然后进一步地等待用户回答,然后进行比对判断。
本次尝试实现一种全新的,基于消息摘要的人机验证方式,后续会继续整理完善成一种可以复制的应用,形成一篇安全类研究文章。
基于消息摘要的人机验证方法不需要第三方Session会话服务器进行问题/答案的存储,减少对第三方的依赖,供应链越短,质量越容易保证。
4. 提速:增加内容压缩后传输
在内容输出前进行压缩,然后再前转交给HTTP Server进行发送,实现传输内容最小化,从而达到页面加载提速的目标。根据在0节的图示描述,页面提速一方面是进行缓存,另一方面是减少页面尺寸(压缩),还有就是将要更新的内容进行局部分割,只更新需要修改的地方,后者已经通过Ajax实现。
这次的主要改动是根据Request中的压缩支持信息进行相应的对内容进行压缩后传输。
如 HTTP Request,
Accept-Encoding: gzip, deflate, sdch
则HTTP Response
Content-Encoding: gzip
Vary: Accept-Encoding
5. Bugfixings and Imprvs
javscript –> javascript
首页底部信息更加丰富
首页定时自动更新
pagenavi, getCondition兼容含有%的oppnsk
经过上述优化和提速,在普通网络环境下,-gMIS 的普通页面请求在服务器端可以做到0.0xx秒完成请求处理,服务器端的每次数据库查询次数减少约80%;页面传送到客户端并展现出来可以做到1秒以内,网络层传输内容压缩比约60%左右。
-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).
Lower Costs, 降低成本; Better Productivity, 提高效率.