@ronaldoooo
2015-07-27T02:33:40.000000Z
字数 5174
阅读 2042
2014-08-06
本文档是对[荆楚网移动站建设说明]的细化,进一步分析系统的需求,并对
系统的实施方案做出初步设计。
本文档主要侧重于移动站的后台流程,即从采页面 到 发布的过程。
本部分对于主要的功能性需求给出解决方案,并进行可行性分析。
为了保证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,并采取生成静态页面方式实现。
在确定了总体方案的基础上,再对需求进行考量。依照功能性需求列表,分析软件的进一步设计方案。
依照系统流程的总体方案,要依照PC端页面来生成静态的移动端页面。需要从网页上采集相应的HTML页面,将该页面转换成静态的移动端页面,依照某种文件存储方案来存储在文件系统中。对此,我将所获取的PC端URL做如下解析:
http://[X].cnhubei.com/[A]/[B]/[C].....
jm.news.cnhubei.com
),则解析出X = jm.news
假定生成的所有移动端页面均储存在/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
对于上面规则给出的地址,按照上述方式进行解析的流程:
给出具体的代码:
//funtion
//@name: get_output_dir
//@param: $url: the page's url
//@return: $output_dir: the output directory
function get_output_dir($url)
{
$s = explode("/",$url);
$s[2] = str_replace(".cnhubei.com", "", $s[2]);//$s[2]:jm.news.cnhubei.com -> jm.news
if(strstr($s[2],".")
{
$temp = explode(".", $s[2]);
$s[2] = $temp[1].".".$temp[0];//jm.news -> news.jm
}
$dir = $s[2];
for($i = 3; $i < sizeof($s); $i++)
$dir .= "/".$s[$i];//news.jm/..../t0000001.html
return $dir;
}
文件存储还有另一种情况,资源文件的存储。
资源文件是指文章中引用的图片,视频等资源。对于图片而言,需要将其转换成适合手机端显示的图片,并存储在文件系统中。在将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...
那么我们采取如下的匹配策略:
http://[X].[Y].cnhubei.com/[A]/[B]/[C]/[D]
http://[X].[Y].cnhubei.com/[A]/[B]/[C]
http://[X].[Y].cnhubei.com/[A]/[B]
http://[X].[Y].cnhubei.com/[A]
http://[X].[Y].cnhubei.com
http://[Y].cnhubei.com
http://cnhubei.com
具体流程如下:
JS插件自动生成的图,部分内容有点重合。
下面给出代码
//funtion
//@name: get_match_rule
//@param: $url: the page's url
//@return: $match_rule: the best fit url rule
function get_match_rule($url)
{
...//cut the 'http://' if exist
if(perfect_fit($url))
return $url;
else if(strstr($url, "/"))
{
$url = substr($url, 0, strrpos($url, "/"));//cut the last dir
return get_match_rule($url);//recursive
}
else if(strstr(str_replace(".cnhubei.com", "", $url), "."))
{
$url = substr(strstr($url, "."), 1);//cut the first domain name
return get_match_rule($url);//recursive
}
else
return "cnhubei.com";
}
对某一页面,在确定了采集的规则之后,就可以依照规则进行转换。页面转换的具体流程包括:
图片转换是将PC端图片转换成便于移动端显示的图片。图片转换主要考虑两个因素:
理想情况是,在显示效果不变的情况下,将图片尽可能压缩至比较小的体积。
采用PHP GD库,在页面转换的同时,抓取页面内容中的图片,对图片进行转换,把结果直接保存在文件系统中。
目前可以做到将图片体积压缩80-90%,而图片显示效果几乎不变。在压缩至将近90-95%时,图片在小分辨率的移动设备上显示几乎不受影响。
下面给出测试用例。原图拷贝自荆楚网新闻页面。在压缩过程中,图片的原始尺寸保持不变。
原图309KB:
压缩至40KB,压缩质量参数设置为75:
压缩至20KB,压缩质量参数设置为20:
压缩至15KB,压缩质量参数设置为10:
结论:
可以将图片压缩质量参数设置为20%,此时图片会体积压缩90%以上,而显示效果变化不大。
新增:后续测试表明,以上所用测试图由于是在夜间,颜色较少,会造成体积上的压缩比例虚高。在后续的测试中,采用色域较广的图片,使用20的质量参数,图片体积会压缩70-80%。
执行效率:php GD库执行效率问题。这一点需要压力测试来进行检验。
对于上面的图片,用一段小程序在本机上执行压力测试,做400次图片转换,耗时在24s左右。图片转换本身的效率大约是20次转换/秒。考虑到在实际使用中,图片是从其它服务器上获取,做转换,再写回其它服务器。还需要加上服务器的IO时间。对于性能的优化尚需再做考量
2014/8/7 11:44 unfinished