手机浏览器服务器端及其实现浏览器双线程模式的方法 技术领域 本发明涉及手机浏览器技术, 尤其是涉及一种手机浏览器服务器端及其实现浏览 器双线程模式的方法。
背景技术 随着移动通信和网络业务的迅猛发展, 移动终端如手机能提供越来越多的功能和 业务, 如: 短信、 彩信、 上网功能等等。 以移动终端是手机为例, 在手机上实现上网功能, 就需 要在手机上装载浏览器, 于是就出现了手机浏览器。所谓手机浏览器是专门运行于手机上 的浏览器, 可以实现通过手机上网浏览各种互联网内容。 在实际应用中, 手机终端一侧作为 手机浏览器客户端, 对应的网络侧作为手机浏览器服务器端, 手机浏览器服务器端接收手 机浏览器客户端上网浏览的请求, 下载并处理网页, 然后推送给手机浏览器客户端显示网 页内容的后台处理程序, 向用户显示所浏览的网页内容。
目前, 手机浏览器分为两种 : 一种称为全页面渲染的浏览器, 是装载于手机浏览器 客户端的一个独立的程序, 能使手机用户像在计算机上使用浏览器一样, 但这种浏览器大 都适用于高端智能手机, 只有这类手机的性能才能满足全页面渲染浏览器的运行 ; 另一种 是带后台处理的浏览器, 这类浏览器中, 用户并不直接从站点下载内容, 而是将请求提交给 统一的服务器, 由服务器端的一系列程序如下载、 解析、 JS 执行等等程序处理过后, 将一个 轻量级的超文本链接标示语言 (HTML) 页面推送给手机浏览器客户端并呈现给用户。这里, JS 是 JavaScript 的简称, 是一种动态的页面编程语言, 通常嵌入在 HTML 文件中, 用于对页 面进行处理和操作, 响应用户请求, 是页面可交互性的主要支撑。
随着动态网页的发展, 对于浏览器, 目前最为影响性能的就是 JavaScript 脚本的 执行, 特别是很多网络应用程序已开始不断涌现。目前各种 JS 引擎都在努力提高自身的性 能, 但 JS 引擎是一个庞大的编译及执行系统, 对资源的消耗比较大。一般, 普通的智能手机 对于复杂的 JS 程序还有些困难, 因此, 现有大多数手机浏览器采用的都是带后台处理的浏 览器, 本文也主要针对第二种浏览器的实现进行讨论。如图 1 所示, 这种浏览器的处理流程 是这样 :
当用户使用带后台处理的浏览器访问网页时, 浏览器程序会通过无线网络向后台 服务器发送页面请求, 由后台服务器与互联网进行通讯, 将网页内容下载, 之后再由后台服 务器对网页内容进行处理, 最终形成一个简单的 HTML 页面, 发送到手机浏览器客户端。这 里, 后台服务器可作为手机浏览器服务器端。
通过上述流程, 可以大大减轻客户端浏览器的压力, 由于目前大多数智能手机的 性能还无法与计算机的性能相比, 因此, 简化客户端程序是非常必要的。也就是说, 原先在 计算机上实现的浏览器程序, 现在需要由手机浏览器客户端程序和后台服务器共同完成 ; 具体的, 采用带后台服务器模式的手机浏览器, 将复杂的任务交给后台服务器执行, 而手机 浏览器客户端只负责显示最简单的页面, 这样可以增强客户端的体验。
对于采用带后台服务器模式的手机浏览器, 后台服务器的主要功能包括 : 帮助客
户端浏览器程序执行 JavaScript 语句 ; 下载网页内容, 并进行处理和过滤后再推送给客户 端, 以大大减少无用信息占用用户流量的比例, 为用户节省流量 ; 将网页改造成为适合手机 显示的模式, 以增强用户体验 ; 响应用户请求事件, 比如按钮点击等等。 相应的, 手机浏览器 客户端可实现的功能包括 : 解析和渲染最简单的不带 JavaScript 语句, 甚至不带层叠样式 表 (CSS, Cascading Style Sheets) 信息的 HTML 页面 ; 向后台服务器发送各种请求, 如: 打 开网页、 点击按钮等等。
对于带后台处理的手机浏览器, 后台服务器基本上对用户来说是透明的, 不仅用 户体验不会降低, 而且这种浏览器可大大减少程序的大小, 简化手机浏览器客户端。 由于消 耗较大的工作都由后台服务器执行, 可提升运算速度, 且不会使用户感觉机器变慢等等, 这 种方式很适合手机这类移动终端使用。但与此同时, 对于服务器来说, 会面临很大的压力 : 首先, 传统意义上的浏览器是客户端程序, 比如 : HTML 解析、 JavaScript 执行等等功能, 如 果遇到恶意代码, 如死循环或 crash, 用户只需要关闭即可 ; 但如果服务器端程序陷入死循 环或 crash, 就会使整个平台不能运转, 进而影响到所有的用户 ; 第二, 客户端大多采用多 线程、 多进程等方式来处理页面, 而服务器端不能采用类似多线程或多进程的模式, 因为所 有用户的页面数据都在服务器端保存, 线程数或进程数将非常大, 服务器端是无法承受的 ; 第三, 页面存在生存期的问题, 大量页面聚积在服务器上, 可能会超出服务器的内存。
鉴于上述问题, 同时考虑到浏览器是一个开放平台, 很多功能需要开放给用户及 网站开发者使用, 因此, 为了保证服务器的健壮性、 稳定性和安全性, 使服务器正常运作, 现 有一种最简单的方案是 : 有选择性的支持某些操作或者标准, 这种方案可禁止所有可能引 发问题的模块的执行, 只提供最简单的服务。其基本流程如图 2 所示, 包括 : 获取到网页数 据后, 先去除 JS 标签及其内容 ; 再解析 HTML 建立 DOM 树 ; 计算 CSS 数据并插入到相应的标 签中 ; 之后反序列化, 生成新的 HTML 页面, 推送给用户的手机浏览器客户端 ; 最后清除页面 数据。这种方案先将 JavaScript 除去, 不支持浏览器脚本, 在生成简单页面并传递给用户 后, 即从服务器上删除。但这种方案存在一些问题, 就是 : 第一、 交互性差。这种方法由于 无法支持 JavaScript, 因此几乎没有网页交互性可言, 像论坛、 邮箱等也大多不能支持 ; 第 二, 过于简单, 后台优势没有得到发挥。显然, 这种方案中后台服务器程序基本只是一个中 转站用来过滤, 使用后台服务器就显得有些多余, 而且提供的页面也过于简单, 用户体验非 常差。
现有技术还提出一种解决方案, 采用监控的概念, 且支持更多的操作, 但此方案在 具体实现上只是简单地在一些程序语句之间添加判断语句, 比如 : 在 JavaScript 语句执行 时, 设置计数器, 每执行几步就将计数器加 1, 如果执行超过一定次数, 就认为超时或者死循 环而退出。因此, 这种方案存在以下问题 : 一方面, 由于每隔一定执行间隙就要添加代码, 不仅降低了代码质量, 影响代码执行效率, 而且还会使代码膨胀, 如果需要监控太多操作的 话, 就会使得代码掺杂太多的无用代码, 直接扩大了程序规模 ; 另一方面, 采用这种方案在 需要改动代码时, 还需要考虑这些掺杂的代码问题, 如果程序添加了某项功能, 需要监控 时, 也需要对这项功能掺杂一些代码, 很不方便, 因此该方案可扩展性差。 发明内容
有鉴于此, 本发明的主要目的在于提供一种手机浏览器服务器端及其实现浏览器双线程模式的方法, 能在不影响代码质量和执行效率, 保证服务器端稳定、 安全、 可靠运行 的同时, 简单方便地实现手机浏览器的双线程内核。
为达到上述目的, 本发明的技术方案是这样实现的 :
本发明提供了一种手机浏览器服务器端实现浏览器双线程模式的方法, 在手机浏 览器服务器端设置监控线程 ; 该方法还包括 :
监控线程对浏览器内核线程执行的程序脚本是否正常进行监控, 并在程序脚本执 行时间到时对未结束执行的程序脚本强制结束 ;
监控线程对浏览器内核线程指定的需执行任务进行监控, 在计时器超时时将需执 行任务放入预设的时间事件队列。
上述方案中, 该方法还包括 : 浏览器内核线程在执行程序脚本之前, 向监控线程发 送监控程序脚本执行的监控任务 ; 并在程序脚本正常执行结束后, 使所述监控任务失效。
上述方案中, 所述监控线程对浏览器内核线程指定的需执行任务进行监控为 : 查 看当前是否有监控任务, 如果没有监控任务, 则监控线程进入睡眠状态 ; 如果有监控任务, 则根据预定执行时间找到最先需要执行的任务, 计算预定执行时间与当前时间的差, 得到 需等待时间后进入等待睡眠状态 ; 休眠需等待时间后, 监控线程开始执行任务, 执行结束后 返回查看状态。 上述方案中, 所述监控线程对浏览器内核线程指定的需执行任务进行监控之前, 该方法还包括 : 浏览器内核线程包装好需执行的任务, 并计算出具体执行的时间 ; 将监控 任务发送给监控线程, 由监控线程监控是否到时。
上述方案中, 该方法还包括 : 浏览器内核线程向监控线程指定除监控程序脚本执 行和监控需执行任务以外的其他监控任务, 监控线程完成对相应监控任务的监控。
上述方案中, 该方法还包括 : 设置监控任务队列 ; 相应的, 所述浏览器内核线程将 监控程序脚本执行的监控任务保存在监控任务队列中 ; 和 / 或将需执行的任务作为监控任 务保存在监控任务队列中 ; 和 / 或将其他监控任务保存在监控任务队列中。
上述方案中, 所述程序脚本为 JavaScript 脚本 ; 所述程序脚本执行为 JS 执行。
本发明还提供了一种手机浏览器服务器端, 包括浏览器内核线程单元、 监控线程 单元和时间事件队列 ; 其中,
浏览器内核线程单元, 用于发送指定的监控任务, 执行程序脚本 ;
监控线程单元, 用于执行对监控任务的监控, 并在程序脚本执行时间到时对未结 束执行的程序脚本强制结束, 在计时时间到时将需要执行的任务放入时间事件队列 ;
所述时间事件队列, 用于保存监控线程单元放置的需执行任务, 并将需执行任务 作为事件由浏览器内核线程单元获取并执行。
上述方案中, 所述监控线程单元, 还用于对除监控程序脚本执行和监控需执行任 务以外的其他监控任务进行监控。
上述方案中, 该手机浏览器服务器端还包括监控任务队列, 用于保存所有监控任 务, 由监控线程单元获取并执行监控。 该手机浏览器服务器端还包括用户请求队列, 用于放 置用户请求, 并由浏览器内核线程单元选择执行。
本发明所提供的手机浏览器服务器端及其实现浏览器双线程模式的方法, 在手机 浏览器服务器端设置监控线程, 与浏览器内核线程并行工作, 可实时监控程序脚本是否正
常执行, 以防止程序脚本如 JavaScript 脚本执行时间过长进入死循环而导致整个平台瘫 痪; 该监控线程还可以监控超时事件, 如此, 可协助浏览器内核线程监控一些计时器到时后 需要执行的任务, 在计时器到时后将需要执行的任务放入相应事件队列, 以备浏览器内核 线程调用执行 ; 该监控线程还可以随时增加需要监控的其他任务, 协助浏览器内核线程完 成对指定任务的监控。 也就是说, 为了保障浏览器内核程序安全、 稳定地运行在手机浏览器 服务器端, 有效规避恶意网页代码导致的服务器瘫痪, 防止不良页面代码对服务器提供的 服务造成危害, 本发明提出的运行在后台服务器的解决方案基于手机浏览器内核的双线程 模式实现。
本发明中, 由于设置了监控线程对浏览器内核线程执行程序脚本进行监控, 这样, 可及时发现服务器端浏览器可能出现的问题, 避免整个平台不能运转, 也不会影响到很多 用户的使用。 本发明中仅增加了监控线程, 来协助浏览器内核线程完成相应工作, 不会增加 服务器端的太多负荷, 能够简单方便的实现监控。
本发明增加监控线程, 是与浏览器内核线程并行工作, 对原有浏览器内核线程获 取网页数据以及对网页数据的处理没有任何影响, 因此, 不会存在交互差、 以及后台服务器 仅作为中转站仅用于过滤数据的问题。
本发明中的监控线程, 是与浏览器内核线程是并列的两个线程, 相互独立执行、 互 不影响, 两者之间仅通过对各个队列, 如: 时间事件队列、 监控任务队列的处理发生关联, 因此, 不会造成程序语句如 JavaScript 语句执行的频繁中断, 也不会因为增加程序脚本如 JavaScript 脚本的代码, 造成代码质量下降和代码执行效率降低。 另外, 由于所设置的监控 线程支持对浏览器内核线程新增监控任务的监控, 无需对浏览器内核线程做很大改动, 具 备足够的可扩展性和更强的适用性。附图说明
图 1 为现有技术中带后台处理的浏览器的实现过程示意图 ;
图 2 为现有技术中保证在手机浏览器服务器端正常运行手机浏览器的一种解决 方案实现流程示意图 ;
图 3 为本发明中手机浏览器服务器端实现浏览器双线程模式的关系示意图 ;
图 4 为本发明中监控线程自身的实现流程示意图 ;
图 5 为本发明中监控线程对 JS 的执行进行监控的实现流程示意图 ;
图 6 为本发明中监控线程对需执行任务进行监控的实现流程示意图。 具体实施方式
本发明的基本思想是 : 在手机浏览器服务器端设置监控线程, 与浏览器内核线程 并行工作, 对浏览器内核线程执行的程序脚本是否正常进行监控, 并对浏览器内核线程指 定的需执行任务进行监控, 在计时器超时时将需执行任务放入时间事件队列, 提供给浏览 器内核线程处理。
这里, 所述程序脚本可以是 JavaScript 脚本, 相应的, 程序脚本执行为 JS 执行。 下 文以程序脚本为 JavaScript 脚本为例, 说明本发明的实现过程及服务器端结构, 监控其他 程序脚本时, 可采用类似过程和结构。针对服务器端浏览器遭遇恶意网页代码时不能自行关闭网页这一问题, 本发明提 出的解决方案就是 : 在手机浏览器服务器端运行的浏览器内核线程之外, 再执行一个单独 的监测线程, 专门用以监控浏览器运行过程中的异常情况, 比如 : 某段 JavaScript 执行时 间超时等等。 另外, 考虑到手机浏览器服务器端不宜开辟过多线程, 否则会导致不稳定及性 能下降的问题, 本发明仅采用双线程模式, 即: 在手机浏览器服务器端运行一个浏览器内核 线程、 一个针对浏览器的监控线程。
具体的, 浏览器内核线程与监控线程之间的关系如图 3 所示, 在手机浏览器服务 器端并行运行有浏览器内核线程 30 和监控线程 31, 浏览器内核线程 30 和监控线程 31 构成 浏览器服务器端的双线程模式, 该双线程结构可以位于图 1 所示的后台服务器中 ; 浏览器 内核线程 30 和监控线程 31 之间通过时间事件队列 33 和监控任务队列 34 相关联。当手机 浏览器用户需要访问某个网页或进行网页操作时, 手机浏览器客户端会发送请求到后台服 务器端, 这些请求存储在用户请求队列 32 中, 会依次调度给浏览器内核线程进行处理。其 中, 浏览器内核线程完成的功能包括 : 解析页面、 执行 JavaScript 脚本、 响应用户操作、 生 成简单页面推送给客户端等等。
如图 3 所示, 浏览器内核线程 30 所实现的功能中, 有三部分子功能与监控线程 31 相关, 具体是 : 第一, 浏览器内核线程 30 在执行 JS 前需要发送请求监控消息给监控线程 31, 以触发监控线程 31 对 JS 是否正常执行进行监控, 相应的, 执行 JS 正常结束后需要取消 监控, 如图 3 中 30a 所示 ; 第二, 浏览器内核线程 30 会执行超时 (Timeout) 消息, 对监控线 程 31 放置于时间事件队列 33 中需执行的任务作为事件进行处理, 如图 3 中的 30b 所示 ; 第 三, 浏览器内核线程 30 会向监控线程 31 指定一些除监控 JS 执行和监控需执行任务以外的 其他监控任务, 由监控线程 31 完成对相应监控任务的监控, 如图 3 中 30c 所示 ; 上述三个部 分相互独立完成, 可以同时具备三个部分, 也可以具备其中一部分或两部分。
监控线程 31 中与浏览器内核线程 30 三部分子功能相对应的子功能包括 : 第一, 对 浏览器内核线程 30 可能出现的不良状况进行监控, 如: JavaScript 脚本由于产生死循环执 行时间过长, 具体的, 监控线程 31 在预先设置的 JS 执行时间到时, 如果 JS 还未执行完, 则 强制结束 JS 的执行, 如图 3 中 31a 所示 ; 第二, 针对延迟事件, 比如 : JavaScript 脚本中的 setTimeout 和 setTimeInterval 函数, 它们指定一段时间后浏览器需要执行的任务, 这种 可以请求监控线程帮忙计算时间, 具体的, 计时器时间到时, 监控线程 31 将需要执行的任 务添加到时间事件队列中, 以便调度给浏览器内核线程 30 执行, 如图 3 中 31b 所示 ; 第三, 监控线程 31 可以执行浏览器内核线程 30 指定的其他监控任务, 如图 3 中 31c 所示, 监控线 程 31 有足够的可扩展性, 能方便地添加各种其他监控需求。
下面结合附图分别对监控线程的整体流程、 监控线程对 JavaScript 脚本执行监 控的流程、 以及监控线程对需执行任务进行监控的流程进行详细描述。
参照图 3, 监控线程所执行的任务是从监控任务队列 34 中取出监控任务, 并在等 待指定时间后调用任务所指定的操作, 具体的监控线程的处理流程如图 4 左侧虚框中所 示, 包括 : 查看当前监控任务队列中是否有监控任务, 如果监控任务队列中没有监控任务, 则监控线程进入睡眠状态 ; 如果监控任务队列中有监控任务, 则根据预定执行时间找到最 先需要执行的任务, 计算预定执行时间与当前时间的差, 得到需要等待的时间, 然后进入等 待睡眠状态 ; 休眠所计算的需等待时间后, 监控线程开始执行任务, 执行结束后, 则进入新一轮的循环返回查看状态, 监控线程是循环执行的。
当外界线程向监控任务队列中添加新任务时, 比如 : 当浏览器内核线程需要监控 线程进行监控时, 就会向监控任务队列中发送监控任务, 如图 4 右侧所示, 浏览器内核线程 将新任务添加到监控任务队列中, 如果此时监控线程处于休眠状态, 则会唤醒处于睡眠状 态的监控线程, 迫使监控线程重新回到原点进行监控任务的调度。
综上所述, 监控线程就是在不断执行监控任务队列中监控任务的过程, 只是这些 监控任务的特殊之处是有时间性, 必须在预定时间之后执行。
随着互联网的发展, 目前的绝大多数 WEB 网页都是动态网页, 与用户之间的交互 是非常普遍的, 这主要在于 JavaScript 脚本语言在网页中的广泛使用。 正因为 JavaScript 的强大功能, 使某些恶意代码会随着网址的被访问而传到浏览器上。 通常, 对于手机浏览器 客户端来说, 网页出现异常, 用户可以自行点击关闭, 结束对当前网址的访问 ; 但对于手机 浏览器服务器端来说, 无法自行关闭, 因此, 本发明提出浏览器双线程模式来解决可能出现 的网页异常情况。
在双线程模式下, 浏览器内核线程每次执行 JavaScript 脚本之前都要向监控线 程发送监控 JS 执行的监控任务, 并设定一个时间 t, 比如 3 秒 ; 当时间 t 过后, JavaScript 脚本如果还未结束, 则必须强行结束 JavaScript 的执行。具体监控线程对 JS 的执行进行 监控的实现流程如图 5 所示, 由左侧虚框内的浏览器内核线程与右侧虚框内的监控线程相 互匹配实现, 包括 :
步骤 11 : 在执行 JavaScript 脚本之前, 需要向监控线程发送监控 JS 执行的监控 任务并设置运行 (Running) 标志, 该监控任务告知监控线程 ;
在 t 秒 时 间 内, 如 果 JavaScript 脚 本 的 状 态 仍 是 Running, 则强行结束 JavaScript 脚本的执行 ; 而如果 t 秒后 JavaScript 脚本的执行状态不为 Running, 则不需 要做任何动作。
步骤 12 : 浏览器内核线程开始执行 JavaScript 脚本 ;
步骤 13 : 浏览器内核线程正常执行完 JavaScript 脚本后, 取消 Running 标志, 如 果步骤 11 中发送的监控任务还没有执行, 则使相应监控任务失效。
采用监控线程后, 后台服务器端的浏览器内核线程可以放心地执行 JavaScript 脚本, 而不用担心死循环或其它原因造成超时, 进而导致的服务器处于停滞状态的问题发 生。
一般, 所有与浏览器内核相关的操作都由浏览器内核线程执行, 但时间控制可由 监控线程来协助计算和监控时间, 因此, 如图 3 所示, 本发明中设置有时间事件队列。比如 : JavaScript 中有两个函数 setTimeOut 和 setTimeInterval, 这两个函数都是要求在一段时 间后执行指定的操作, 从 setTimeout( 或 setTimeInterval) 开始, 指定时间过后, 监控线程 就通过时间事件队列告知浏览器内核线程, 可以执行该操作了 ; 当浏览器内核再次调度队 列时, 则可以执行该事件了。具体的监控线程对需执行任务进行监控的实现流程如图 6 所 示, 包括 :
步骤 21 : 开始执行 setTimeOut 或 setTimeInterval 等与时间事件相关的函数 ;
步骤 22 : 浏览器内核线程包装好需要执行的任务, 并计算出具体执行的时间 ;
步骤 23 : 浏览器内核线程将监控任务发送给监控线程, 由监控线程去监控具体时间, 如果监控线程发现时间到了, 则加入到时间事件队列中。
这样, 当浏览器内核线程再次调度时, 会查找有没有时间事件可以执行, 如果有的 话就执行, 如图 1 所示选择要处理的请求或事件。
本发明的双线程模式将监控任务包装起来, 可以大大增加程序的可扩展性, 如果 有某些模块需要被监控的话, 只需要在进入模块前发送监控请求到监控任务队列中, 监控 线程就会按照包装任务的要求对相应模块进行监控。 举个简单的例子, 比如 : 页面驻留内存 时间超时, 则可通过监控线程在超时后将驻留页面从内存中删除, 以防止页面长期驻留内 存造成服务器压力变大。 可见, 本发明可以很容易将任务添加进来, 纳入监控线程的监控范 围。
为了实现上述方法, 本发明还提供了一种手机浏览器服务器端, 包括浏览器内核 线程单元、 监控线程单元和时间事件队列 ; 其中,
浏览器内核线程单元, 用于发送指定的监控任务, 执行 JavaScript 脚本 ; 这里, 所 述指定的监控任务可以是在执行 JavaScript 脚本前发送的监控 JS 执行的监控任务, 也可 以是一些延迟一段时间后需执行的监控任务, 还可以是除监控 JS 执行和监控需执行任务 以外的其他监控任务 ; 所述监控线程单元, 用于执行对监控任务的监控, 并在 JS 执行时间到时对未结束 执行的 JS 强制结束 JS 的执行, 在计时时间到时将需要执行的任务放入时间事件队列 ; 这 里, 所述监控任务包括但不限于对 JS 执行的监控、 对计时时间到后需要执行的任务的监 控;
所述时间事件队列, 用于保存监控线程单元放置的需执行任务, 并将需执行任务 作为事件提供给浏览器内核线程单元执行。
所述监控线程单元, 还用于对除监控 JS 执行和监控需执行任务以外的其他监控 任务进行监控。
相应的, 该手机浏览器服务器端还包括监控任务队列, 其中, 所述监控任务队列, 用于保存所有监控任务, 供监控线程单元获取并执行监控 ; 所述浏览器内核线程单元发送 指定的监控任务就是将监控任务保存到监控任务队列中, 所述监控任务为监控 JS 执行的 监控任务、 和 / 或需执行的任务、 和 / 或其他监控任务。
该手机浏览器服务器端还包括用户请求队列, 用于放置用户请求, 并由浏览器内 核线程单元选择执行。
本 发 明 除 了 可 以 用 于 JavaScript 环 境 外, 还 可 以 适 用 于 VBScript、 Document Object Model、 Layers 和 Cascading Style Sheets 等环境, 以上所述, 仅为本发明的较佳 实施例而已, 并非用于限定本发明的保护范围, 凡在本发明的精神和原则之内所作的任何 修改、 等同替换和改进等, 均应包含在本发明的保护范围之内。