[关闭]
@ronaldoooo 2015-07-27T02:33:40.000000Z 字数 5174 阅读 2042

移动站方案设计

2014-08-06

背景

本文档是对[荆楚网移动站建设说明]的细化,进一步分析系统的需求,并对
系统的实施方案做出初步设计。

本文档主要侧重于移动站的后台流程,即从采页面发布的过程。

前置文档

系统用户

系统流程

后台流程

Created with Raphaël 2.1.2开始获取输入的 UrlList判断文档类型是否为组图读取组图内容模板读入页面处理页面内容输出静态移动版页面结束读取文章内容模板yesno

前台流程

Created with Raphaël 2.1.2开始用户输入某个站内地址判断是否是移动端地址显示移动端页面结束转换为移动端URLyesno

系统交互

后台交互

Created with Raphaël 2.1.2管理员管理员系统系统输入PC端UrlList系统循环完成内部流程输出移动端UrlList

前台交互

Created with Raphaël 2.1.2用户用户系统系统使用移动设备输入任意站内地址自动完成地址转换显示移动端地址

需求列表

功能性需求

  1. 文件存储(文章,视频,图片等)
  2. 页面转换
  3. 组图操作(左右滑动翻页)
  4. 视频正常浏览
  5. 额外模块(广告等)
  6. 后台管理
  7. 评论(预留)

非功能型需求

  1. 用户体验
  2. 执行效率
  3. 误操作
  4. 安全性
  5. 可拓展性(如采集规则的动态配置)

方案设计

本部分对于主要的功能性需求给出解决方案,并进行可行性分析。

总体方案

为了保证PC端和移动端都有良好的显示效果,可能的方案如下:

方案编号 方案说明 方案优点 方案缺点
S1 使用响应式布局 只需修改现有的模板,就能很好的同时支持pc端和移动端。网站内容有很好的内容一致性。对搜索引擎的支持也好。 现有模板很多,相互之间调用关系复杂,页面改造难度极大。需要既懂荆楚网内容模板又有很好的前端技术才能进行改造。实施风险较大!
S2 生成对应的静态页面地址,通过服务器端rewrite配置进行跳转 相比S3,S4,S5,该方案更有利于爬虫的抓取 实际上是访问的不同URL
S3 移动页面动态实现 不必解析PC端HTML,在浏览时直接从库中取出相应信息 如何解决跨平台的数据库支持,实时查库对数据库访问资源压力较大
S4 移动页面直接绑定在模板上 PC页面不变,实施风险小;只需创建移动端模板,绑定在CMS系统的模板中。网站内容有很好的内容一致性。对搜索引擎的支持也好。 现有的CMS系统暂不支持绑定多个模板
S5 移动页面静态实现 同S3 同S3,由于是生成静态页面,一致性可能会差一些。

综合考虑五种总体的方案,依照目前的技术可行性可以排除S1,S4。S2,S3,S5的区别在于,移动端和PC端是否使用相同的URL,以及是否采用动态页面

目前确定的方法是S2,并采取生成静态页面方式实现。

在确定了总体方案的基础上,再对需求进行考量。依照功能性需求列表,分析软件的进一步设计方案。

文件存储方案(8月7日修改)

页面存储方案

依照系统流程的总体方案,要依照PC端页面来生成静态的移动端页面。需要从网页上采集相应的HTML页面,将该页面转换成静态的移动端页面,依照某种文件存储方案来存储在文件系统中。对此,我将所获取的PC端URL做如下解析:

http://[X].cnhubei.com/[A]/[B]/[C].....

假定生成的所有移动端页面均储存在/wap文件夹下,则上述URL在经过系统转码后,文件位置则是:

/wap/[X]/[A]/[B]/[C]....   注意,如果X包含三级域名如X = jm.news,则会将X处理成news.jm

关于为何在此仅做到二级子目录精确解析,是依据荆楚网网站模板实际情况,不会在同一个二级子目录下存在不同的模板。

这里假定不存在 4级域名的情况。即不存在形如xyz.jm.news.cnhubei.com的域名。


关于页面存储的目录,目前存在几种考量。假定存在一个比较长的URL:

http://jm.news.cnhubei.com/zt/2014zt/jj/t0000001.shtml

存在几种存储的方式:

方案编号 方案说明 优势 劣势
S1 存储为news/jm/t0000001.shtml 简洁,同一个域名下的文章会集中存放 1.ID可能重复。2.因为在存储的时候砍掉了中间目录,无法从手机版页面回溯到PC版页面,这样可能会对后续开发造成影响。
S2 存储为news/jm/zt/2014zt/jj/t0000001.shtml 同上,在news域名下的文章都位于一个文件夹内 jm.news域名存放在news/jm文件夹下,可能会产生冲突。比如存在另一个news.cnhubei.com/jm地址下的文章,也会存储在该文件夹下。这样也会产生无法回溯的问题。
S3 存储为news.jm/zt/2014zt/jj/t0000001.shtml 解决了以上的问题 暂无

下面详述S3

对于上面规则给出的地址,按照上述方式进行解析的流程:

Created with Raphaël 2.1.2startget urlexplode url to list[str]X contains '.'?reverse Xput article into storageendyesno

给出具体的代码:

  1. //funtion
  2. //@name: get_output_dir
  3. //@param: $url: the page's url
  4. //@return: $output_dir: the output directory
  5. function get_output_dir($url)
  6. {
  7. $s = explode("/",$url);
  8. $s[2] = str_replace(".cnhubei.com", "", $s[2]);//$s[2]:jm.news.cnhubei.com -> jm.news
  9. if(strstr($s[2],".")
  10. {
  11. $temp = explode(".", $s[2]);
  12. $s[2] = $temp[1].".".$temp[0];//jm.news -> news.jm
  13. }
  14. $dir = $s[2];
  15. for($i = 3; $i < sizeof($s); $i++)
  16. $dir .= "/".$s[$i];//news.jm/..../t0000001.html
  17. return $dir;
  18. }

资源文件存储方案

文件存储还有另一种情况,资源文件的存储。

资源文件是指文章中引用的图片,视频等资源。对于图片而言,需要将其转换成适合手机端显示的图片,并存储在文件系统中。在将PC端HTML转换为移动端页面时,会将对应的PC端的图片链接到转换后的图片地址。

由于在PC端,图片是与HTML页面共目录。比如:http://news.cnhubei.com/xw/yl/201408/t3005874_1.shtml
中引用了图片W020140805549496102554.jpg,则该张图片的位置就是

http://news.cnhubei.com/xw/yl/201408/W020140805549496102554.jpg

那么我们就可以直接使用在移动端一样。将该图片转换成移动端适用的图片后,重命名为W020140805549496102554_small.jpg,再存储于

/wap/images/news/xw/yl/201408/W020140805549496102554_small.jpg

在转换HTML页面时,只需将图片地址后加上_small,然后沿用其相对地址即可。
将所有图片存储于images文件夹下,再根据目录细化。相对地址也要转换成绝对地址。

页面转换方案

页面转换是将PC端页面转换成相应的移动端页面的流程。(可参见管理员流程图)包括两个步骤:

由于PC端网页由不同模板生成,需要以不同的规则来采集网页信息。在存在多个可能匹配的采集规则时,如何确定应该依照哪条规则来采集网页。

初步的想法是采用逐步递减的匹配策略。假如提供如下的URL,对其进行解析:

http://[X].[Y]cnhubei.com/[A]/[B]/[C]/[D]/t0000001.shtml

注意这里不一定只到D,可能后面还有EFGH...

那么我们采取如下的匹配策略:

具体流程如下:

Created with Raphaël 2.1.2startget url丢弃http://恰有匹配?成功匹配有父目录?丢弃末尾子目录有父域名?丢弃最首子域名匹配失败yesnoyesnoyesno

JS插件自动生成的图,部分内容有点重合。

下面给出代码

  1. //funtion
  2. //@name: get_match_rule
  3. //@param: $url: the page's url
  4. //@return: $match_rule: the best fit url rule
  5. function get_match_rule($url)
  6. {
  7. ...//cut the 'http://' if exist
  8. if(perfect_fit($url))
  9. return $url;
  10. else if(strstr($url, "/"))
  11. {
  12. $url = substr($url, 0, strrpos($url, "/"));//cut the last dir
  13. return get_match_rule($url);//recursive
  14. }
  15. else if(strstr(str_replace(".cnhubei.com", "", $url), "."))
  16. {
  17. $url = substr(strstr($url, "."), 1);//cut the first domain name
  18. return get_match_rule($url);//recursive
  19. }
  20. else
  21. return "cnhubei.com";
  22. }

对某一页面,在确定了采集的规则之后,就可以依照规则进行转换。页面转换的具体流程包括:

Created with Raphaël 2.1.2开始读取页面,读取采集规则丢弃页面中不需要的元素正则匹配,采集相关信息(如编辑,作者,内容等)如存在图片,将图片转成适合移动端显示的图片并存储修改所有链接的URL地址,使其指向正确的移动端页面地址生成移动端页面 存储至相应位置结束

图片转换方案

图片转换是将PC端图片转换成便于移动端显示的图片。图片转换主要考虑两个因素:

理想情况是,在显示效果不变的情况下,将图片尽可能压缩至比较小的体积。

采用PHP GD库,在页面转换的同时,抓取页面内容中的图片,对图片进行转换,把结果直接保存在文件系统中。

目前可以做到将图片体积压缩80-90%,而图片显示效果几乎不变。在压缩至将近90-95%时,图片在小分辨率的移动设备上显示几乎不受影响。

下面给出测试用例。原图拷贝自荆楚网新闻页面。在压缩过程中,图片的原始尺寸保持不变

结论
可以将图片压缩质量参数设置为20%,此时图片会体积压缩90%以上,而显示效果变化不大。
新增:后续测试表明,以上所用测试图由于是在夜间颜色较少,会造成体积上的压缩比例虚高。在后续的测试中,采用色域较广的图片,使用20的质量参数,图片体积会压缩70-80%

执行效率:php GD库执行效率问题。这一点需要压力测试来进行检验。
对于上面的图片,用一段小程序在本机上执行压力测试,做400次图片转换,耗时在24s左右。图片转换本身的效率大约是20次转换/秒。考虑到在实际使用中,图片是从其它服务器上获取,做转换,再写回其它服务器。还需要加上服务器的IO时间。对于性能的优化尚需再做考量

#


2014/8/7 11:44 unfinished

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注