基于Lamp的页面静态化技术的研究与实现 伊文杰,马跃** 作者简介:伊文杰(1987-),男,计算机网络与多媒体 通信联系人:马跃(1965-),男,副教授,计算机网络与多媒体. E-mail: mayue@bupt.edu.cn (北京邮电大学计算机学院,北京 100876) 5 摘要:大型网站出于业务的需求,要求Web服务器做出快速的响应,然而当服务器遇到上亿级的并发访问时,服务器往往呈现出请求严重超时,有效访问急剧下降,页面静态化技术便应运而生,把客户端访问量较高的请求进行缓存,当再出现同样的请求时取出缓存并返回给客户端。本文研究两种不同的技术实现页面的静态化,一种是基于PHP缓存的静态化技术,此种方案可以实现对高并发性访问的优化,另一种则是基于Apache的rewrite机制实现的10 SEO优化技术,这种方案可以大大提高网站的曝光率,方便百度和谷歌的爬虫爬取网站内容。经过压力测试发现采用基于PHP缓存的页面静态化的网站并发访问时不会再出现请求超时现象,采用基于rewrite机制的网站在SEO测试中分数比没有采用的网站高。 关键词:PHP;静态化;高性能 15 中图分类号:TN919-34,TP311.5 Research of staticization of the web based on Lamp YI Wenjie, MA Yue (School of Computer Science and Technology,Beijing University of Posts and 20 Telecommunications,Beijing 100876) Abstract: Quick response is always the most important factor that in most large websites,especially that sites have billions of request in a limit time,so the site need a mechanism to optimize clients' request.Staticization of the web page is an effective method to keep the web server in quick response mode.This paper discuss two different optimize methods,the first 25 mechanism is based on cache from php,while the second rely on the rewrite mechanism.the first one can provide quick response while the second one can reach a hight score in SEO test.After stress test,web service show high availability if its often used requests are buffer by memcache,and score hight in SEO test if armed with staticization based on the rewrite mechanism. Key words: PHP; staticization; high performance 30 0 引言 电商总是喜欢在节日的时候采用各式各样的促销活动,如国庆、双十一、元旦等,在节日期间电商网站的访问量往往会急剧增加,达到上百万/秒或上亿/秒的访问量,如此高的访问量要求从各方面实现服务器的高并发性和高可用性。以下是从互联网上收集的某些商品的35 url: http://book.360buy.com/11069121.html 京东A商品的页面; http://www.amazon.cn/mn/detailApp?uid=475-3109884-8670109&ref=YS_TR_2&asin=B006LB2ZAK 亚马逊B商品的页面。 京东A商品对应着含有一串数字的url,而亚马逊B商品的url则找不到 html、jsp或php40 的踪迹,相反在此url后面却跟着一串参数,按常理一个静态的页面是无法接受参数的。 在百度或谷歌中搜索某件商品时,京东商品的页面往往会排在前几位。 本文接下来详细说明这其中的原理并探究两种方案,第一种是基于PHP缓存的静态优 化技术[1],利用内存级的数据库Memcache缓存从 PHP中取得的响应内容,当相同的请求到来时返回缓存内容,以此实现屏蔽那些费时的数据库查询以及计算来提高服务器并发性45 [2]。别一种则是基于Apache的rewrite机制实现SEO优化技术,由于百度和谷歌的爬虫不会爬取动态页面的内容,所以使用使用rewrite机制把动态页面伪装成静态页面,以此提高网站的曝光率,使搜索结果在搜索排名中尽量靠前。 1 基于PHP缓存的静态优化技术 1.1 Apache 处理请求介绍 50 当客户端在浏览器地址栏中输入一个静态页面的url后,浏览器首先使用DNS解析网站的IP,再使用HTTP的GET方式发送给服务器,由于请求的是一个静态页面,所以服务器从web目录读取相应的网页文件,最后在文件内容之前加入HTTP 头做为返回内容,企业级的服务器集群一般会在10ms内处理完一个静态页面请求。如果客户端请求的是PHP动态页面则需要启动PHP进程并运行PHP页面中的代码,再把PHP进程的输出作为返回内55 容,动态页面的访问时间一般会控制在200ms以内。 由于动态页面需要查询数据库以及可能有其它的计算业务,所以需要服务器花掉一部分时间得到输出,因此服务器才在处理这一请求时响应缓慢。 1.2 PHP中的缓存介绍 PHP中的缓存配置可以在配置文件 php.inf中找到,通过output_buffering = On打开 PHP60 的输出缓存,output_buffering = Off则关闭输出缓存[3]。 1.ob_start() 开启缓存,如果在配置文件中关闭PHP输出缓存的话可以通过这个函数开启。 2.ob_clean()清空缓存,但不会输出。 3.ob_flush(); flush() 清空并输出缓存。 65 4.ob_end_flush() 输出缓存并关闭。 5.ob_end_clean() 清空输出缓存并关闭。 6.ob_get_contents() 取得当前缓存中的内容。 由于PHP中提供了齐全的缓存函数,所以可以在发送响应之前通过接口函数得到响应页面内容并保存下来。 70 1.3 使用memcache缓存页面的静态化技术 1.3.1 基于请求的自动生成静态页面技术 为了省去查询数据库等费时的操作以及其它计算业务,提高服务器的并发性,需要缓存响应页面,具体处理过程如下: 1.首先对查询的内容按一定的命名规则生成一个key,再连接Memcache并使用这个key75 查询有无缓存的静态网页文件,如果有缓存的页面则进入第2步,如果没有则进入第3步。 2.直接返回缓存的静态页面,返回前需要添加编码设置的代码 ,最后进入第4步; 3.首先使用ob_start()开启缓存(在配置文件中若已开启输出缓存则无需此步),再使用ob_clean()清空缓存,查询数据库得到相应的信息以入处理相应业务,使用PHP的输出函数输出相应的内容,在所有输出结束后调用ob_get_contents()取得当前的缓存页面内容,并按80 约定的命名规则生成key,连接Memcache把页面保存至Memcache中。 4.返回。 命名规则是在程序中规定的一个映射,由于Memcache是一个key-value的内存级数据库,所以这个映射要完成从用户请求到内容的映射,可以使用查询内容在数据库中存放的id进行拼接组成一个key。 85 1.3.2 在数据改变时更新缓存 缓存的页面往往会造成数据的不一致,以京东商场A商品为例,如果在Memcache中已经缓存了A商品的页面,当开展一场降价活动时,修改了数据库中A商品的价格后,但是服务器返回的是之前缓存的内容,所以在网页中不会体现价格变化,这时可以在修改商品内容时连接Memcache,通过命名规则生成key,再删除Memcache中对应的key值,当客90 户端再去请求这个商品的网页时,由于已经没有了缓存,所以PHP进程会再去数据库中查询数据重新生成缓存,这时就可以看到除了价的商品,缓存的页面也会有最新的价格,体现出最新的页面。 1.3.3 缓存页面与PHP页面请求处理比对 使用apache提供的压力测试工具ab对PHP 页面进行压力测试,再对这个PHP 页面制95 作相对应的缓存静态页面,为了排除其它因素的影响,在相同的系统环境下采用相同的压力测试参数对静态页面测试,得出以下表格数据,如图1。 02040608010012014016050%66%75%80%90%95%98%99%100%php页面静态化页面时间(m完成任务比例 图 1 php页面与采用缓存的静态页面对比 压力测试命令 ab -c 100 -n 1000 http://url 100 压力测试命令的意思是每次发送100个请求(并发性),一共完成1000次请求。得到的结果纵坐标是完成的时间(ms),横坐标是完成任务的百分比。从图中可以看出,静态化的页面50%请求在20ms内完成,而PHP页面则在80ms内完成,静态化的页面98%的请求在40ms内完成, 而PHP页面则在95ms内完成,静态化页面所有请求在80ms内完成,而PHP 页面则在150ms内完成。测试结果明显显示静态化技术可以把服务器的性能提升两倍左右, 105 这是因为采用了缓存的静态化页面不再需要连接后台Mysql数据库或做相应的业务处理,服务器处理响应时不再需要复杂的数据计算,最重要的一点是完全屏蔽硬盘级及硬盘级以下的IO访问,全部操作在内存内完成,如此便提高了系统的处理速度,提高了并发性,其原理类似于基于httphandler的静态化技术原理是一样[4]。由于本次测试是在一台配置一般的个人机器上完成,所以缓存的静态页面的优势还不算理想,如果采用在一台企业级别的服务器上110 完成测试的话,两者的差距还会更大,更能体现出静态化页面的性能提升。 2 基于rewrite 机制的伪静态技术 2.1 启用Apache的虚拟主机机制 Apache可以配置成基于IP虚拟主机和基于主机名的虚拟主机服务器,本文只讨论采用基于主机名的虚拟主机。 115 把Apache配置成基于主机名的虚拟主机是目前比较常用的一种配置方案,因为它不仅可以节约IP地址,而且不需要硬件的支持。现在主流的浏览器如IE,Firefox,Safari,Chrome等均支持虚拟主机的实现方法,其原理是根据客户端提交的HTTP头部中的关于主机名的HOST标签来决定所匹配的虚拟目录。 开启Apache的虚拟主机,只需在Apache的配置文件(一般是httpd.conf )中加入以下内120 容便可以加入一个虚拟主机。 <VirtualHost :80> ServerAdmin root@demo.com DocumentRoot /var/www/httpdocs/static ServerName www.demo.com 125 ErrorLog logs/demo.com-error.log CustomLog logs/demo.com-access.log common </VirtualHost> 在上面的配置文件中,ServerName指定了使用的虚拟主机名,当浏览器通过 www.demo.com/a.html 访问时,Apache便会匹配这个虚拟目录,进而转向130 /var/www/httpdocs/static这个虚拟目录。 2.2 启用rewrite机制 Apache的 rewrite机制本质上是一个url重定向,在Apache的配置文件httpd.conf 中加入以下代码: LoadModule Rewrite_module modules/mod_Rewrite.so 135 加入后便开启了rewrite机制,为了使新的配置生效,在修改好配置文件后需要重启Apache服务器。 2.3 在虚拟目录下添加rewrite规则 开启rewrite 机制只是实现伪静态的第一步,之后还需要指定rewrite规则才能按需求进行重定向。在引言中列出一个亚马逊的url,这个url对应的页面是一个html的静态页面,140 由于静态页面是无法接收参数的,但是这个url后面却跟着一堆参数,因为这里使用了rewrite机制把url后面的参数重新传递至一个php 页面。 在写rewrite规则的范例之前,首先要在虚拟主目录下创建一个".htaccess"文件,在这个文件中加入rewrite 规则。 RewriteEngine On 145 RewriteRule news-id(\d+)\.html$ news.php?id=$1 RewriteRule top-id(\d+)\.html$ top.php?id=$1 RewriteEngine On的意思是表示打开rewrite引擎,只有打开rewrite引擎后续的重写规则才会生效,否则无效。 Apache按rewrite规则一条一条的匹配,如果url能够匹配上规则,则按规则重定向到150 新的网页,如果所有的规则全部失效的话则认定url是一个静态文件,从虚拟目录中查找这个静态文件返回给客户端。 学术论文网Tag:代写硕士论文 代写论文 代写代发论文 代发论文 |