11 秒杀系统 | 基于 phantomjs 全页面静态化技术的优化

本文介绍了如何通过PhantomJS在服务端执行jQuery代码,生成静态HTML页面,实现商品详情页的全页面静态化。过程中涉及添加隐藏域、全局函数以避免AJAX请求,以及利用CDN进行部署。最后通过实例展示了具体的操作步骤。
摘要由CSDN通过智能技术生成

思路

  • 将 getitem.html 中 jQuery(document).ready(function(){... }) 方法中的内容,在服务端或爬虫端执行掉,执行完成之后,依赖于爬虫,生成一个 reload dom 完成的静态 html 文件;
  • 将生成出来的静态 html 文件部署到 CDN 上,完成全页面静态化的操作;

针对商品详情页的全页面静态化实践

编写 phantomjs 脚本 getitem.js

    
    
  1. var page = require( "webpage"). create();
  2. var fs = require( "fs");
  3. page. open( "http://localhost/resources/getitem.html?id=1", function(status) {
  4. console. log( "status = " + status);
  5. setTimeout( function() {
  6. fs. write( "getitemphantom.html", page.content, "w");
  7. phantom. exit();
  8. }, 1000);
  9. });
修改 getitem.html 中的内容
  • 添加隐藏域;
<input type="hidden" id="isInit" value="0" />

    
    
  • 添加几个全局函数,其实就是使用 Balking 模式,使得由无头浏览器执行完,并且生成出来的静态 html 页面,由用户再去打开的时候 ,不会再发 ajax 请求给后端;

    
    
  1. function hasInit( ) {
  2. var isInit = $( "#isInit"). val();
  3. return isInit;
  4. }
  5. function setHasInit( ) {
  6. $( "#isInit"). val( "1");
  7. }
  8. function initView( ) {
  9. var isInit = hasInit();
  10. if(isInit == "1") {
  11. return;
  12. }
  13. /**
  14. * ajax 请求对应的域是本地文件,请求的服务器的域名是 localhost,能请求,能响应,但是 ajax 的回调函数认定域不同,是不安全的,
  15. * 因此会报错,并且走不到 ajax 的 success 回调中;
  16. * 解决方案:在 Response 的 Header 中增加字段 Access-Control-Allow-Origin:*
  17. */
  18. $. ajax({
  19. type: "GET",
  20. url: "http://"+g_host+ "/item/get",
  21. data:{
  22. "id": getQueryString( "id")
  23. },
  24. // 允许跨域的授信请求,和后端 @CrossOrigin(allowCredentials = "true") 呼应,
  25. // 使 Session 变成跨域可授信(从 Session 中可以取到短信验证码)
  26. xhrFields:{ withCredentials: true},
  27. success: function( data){
  28. if(data. status == "success"){
  29. g_itemVO = data. data;
  30. reloadDom();
  31. setInterval(reloadDom, 1000);
  32. setHasInit();
  33. } else{
  34. alert( "获取商品详情失败,原因为:" + data. data. errMsg);
  35. }
  36. },
  37. error: function( data){
  38. alert( "获取商品详情失败,原因为:" + data. responseText);
  39. }
  40. });
  41. }
  • 修改 getitem.js

    
    
  1. var page = require( "webpage"). create();
  2. var fs = require( "fs");
  3. page. open( "http://localhost/resources/getitem.html?id=1", function(status) {
  4. console. log( "status = " + status);
  5. var isInit = "0";
  6. setInterval( function() {
  7. if(isInit != "1") {
  8. page.evaluate( function(){
  9. initView();
  10. });
  11. isInit = page.evaluate( function(){
  12. return hasInit();
  13. });
  14. } else {
  15. fs. write( "getitemphantom.html", page.content, "w");
  16. phantom. exit();
  17. }
  18. }, 1000);
  19. });
  • 执行 getitem.js,注意,此时修改过的 getitem.html 必须放到 Nginx 上去,执行成功后,会生成 getitemphantom.html,其中隐藏域的 value 已经设置成了 1;
  • 用户如果用浏览器打开 getitemphantom.html 会发现没有网络请求,这是一个完全静态化的 html 页面,把这个页面放到 CDN 上去,就可以在 CDN 层面完全命中,不会再有哪怕 ajax 的请求打到源站服务器上去了;

    
    
  1. lixinlei @pc :~/application/phantomjs- 2.1. 0-linux-x86_64 $ bin/phantomjs js/getitem.js
  2. status = success
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值