`
dingdingfm
  • 浏览: 49779 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

用new Image().src作LOG统计的一个注意事项

阅读更多
转载:http://blog.csdn.net/fudesign2008/article/details/6772108
用new Image().src作LOG统计的一个注意事项
2009-08-06 17:40

在大型网站做很多用户行为分析、产品的策划方案基本上都是通过分析用户的访问等信息而做出的,LOG信息的统计准确性会直接影响到产品的设计开发(比如搜索结果的先后排名rank值的产生等)。目前最常用的一个写LOG的方法就是用JavaScript脚本在网页里 new Image().src = "http://xxx.com/log?msg="+ msg; 这种统计方法基本上不会干扰用户的正常操作,虽然有LOG丢失的可能,但只要用得好,还是一种非常好的LOG统计回收的方案。

但是这种LOG回收手段有一个非常隐秘的隐患,事情是这样被发现的。今年3月份百度搜索结果页面上线了Suggestion功能升级版,在LOG统计中突然发现上线后的LOG总量比上线前的少了很多(10%以上),表现出来的现象就是LOG丢失了,没有回收到服务器中来。

工程师立即做了详细排除,从各种因素上确定LOG的大量丢失跟网页上线Suggestion有关,我们马上对Suggestion脚本进行地毯式排查,逐行分析代码,结论是这个脚本没有阻拦 new Image().src 的发包请求(至少表面上是这样的),这段脚本放在一个脚本闭包中,没有影响到全局变量/方法,也没有屏蔽干扰HTTP请求的因素。

我们又做了一个线下试验,同样的代码环境,在线下的测试环境中用这种 new Image().src 的手段,总共向Server端发送了10000个LOG数据,也没有发生LOG丢失,试验的结果也没有发现LOG丢失的原因。

但是在线上的环境中发生的就是有LOG数据丢失,原因不明,所以只能紧急下线这个Suggestion升级版。在这个脚本下线之后,LOG统计数据马上回归到“原正常”状态。从这个现象来看,也从另一个角度说明上线的新脚本确实对LOG统计有影响,头疼呀......

愚者千虑,必有一得!最后方知这个问题的原因是浏览器的垃圾回收机制

function c(q) {
    var p=window.document.location.href,sQ='',sV='';
    for(v in q){
        switch (v){
            case "title":sV=encodeURIComponent(q[v].replace(/<[^<>]+>/g,""));break;
            case "url":sV=escape(q[v]);break;
            default:sV=q[v]
        }
        sQ+=v+"="+sV+"&";
    }
    new Image().src = "http://s.baidu.com/w.gif?q=meizz&"+sQ+"path="+p+"&cid=9&t="+ new Date().getTime();
    return true;
}

这个 new Image() 对象没有赋给任何变量,在这个函数执行结束时,浏览器的垃圾回收机制对这种“无主”的对象是毫不客气的回收的,而正是这种回收行为导致了这个HTTP请求(异步的)没有发出,从而造成了LOG数据的丢失。那为什么上线一个脚本就会造成大量的LOG丢失呢?因为一个大脚本的运行回产生大量的“垃圾”,浏览器垃圾回收也会相应地更频繁的启动,从而造成LOG数据丢失。找到原因之后对症下药,把这个 new Image() 对象赋给一个全局有变量常期持有即可,相应的代码如下:

var n = "log_"+ (newDate()).getTime();
var c = window[n] =newImage();  //把new Image()赋给一个全局变量长期持有
c.onload = (c.onerror=function(){window[n] = null;});
c.src = "
http://s.baidu.com/w.gif?q=meizz"+ xxxx;
c = null;      //释放局部变量c

在这个统计代码上线之后,百度的搜索结果页面的LOG立即多出近10%,之后再上线其它的脚本也没有再出现LOG统计量的波动。

 

---------------------------------------------------------------------------------------------------------------------------------

 

局部变量下,测试连续发1000个log

IE6-7 发现log丢失,某些IE内核浏览器也发现log丢失

但在FF, chrome下未发现丢失

 

因此 保险的做法是用一个非局部变量持有

 

[javascript] view plaincopy
 
  1. var unique = (function () {  
  2.     var time= (new Date()).getTime()+'-', i=0;  
  3.     return function () {  
  4.        return time + (i++);  
  5.     }  
  6. })();  
  7.   
  8. var imgLog = function (url) {  
  9.     var data = window['imgLogData'] || (window['imgLogData'] = {});  
  10.     var img = new Image();  
  11.     var uid = unique();  
  12.     img.onload = img.onerror = function () {//销毁一些对象  
  13.         img.onload = img.onerror = null;  
  14.         img = null;  
  15.         delete data[uid];  
  16.     }  
  17.     img.src = url + '&_uid=' + uid;  
  18. };  


原文:http://blog.csdn.net/fudesign2008/article/details/6772108

 

分享到:
评论

相关推荐

    System.Drawing.Image.FromStream 出现参数无效的解决方法及图片类型判断

    System.Drawing.Image.FromStream 出现参数无效的解决方法

    Canvas2Image.js

    Web开发canvas2image.js将canvas保存为图片,下载图片。

    load-image.min.js

    load-image.min.js 是jQuery File Upload上传组件中必须的一个js,否则会报TypeError: loadImage.parseMetaData is not a function错误。不过现在的load-image.min.js中没有parseMetaData 这个方法,但是这个方法在...

    dom-to-image.js

    一开始使用的是html2canvas.js。功能是可以实现,但是有缺陷(表格存在合并的单元格时,生成的图片表格线框不完整),后来很不容易知道了dom-to-image.js,尝试之后觉得非常不错

    本地PNG操作库PNGjs-Image.zip

    console.log(image.getWidth()); console.log(image.getHeight()); // Set a pixel at (20, 30) with red, having an alpha value of 100 (half-transparent) image.setAt(20, 30, { red:255,...

    import com.sun.image.codec.jpeg.JPEGImageEncoder;包的下载

    base64找不到下面连个jar包也可以解决 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; 报错: Access restriction: The type JPEGImageEncoder is not accessible due to restriction on required...

    stb_image.rar

    stb_image,比较好用的图片解码库。 内含stb_image.h和stb_image.c 没有lib或ll,加载到工程即可使用

    CDimage.exe

    有一部分镜像制作软件集成了CDimage内核,比如Easyboot自身就集成CDimage内核,而本人使用的UltraISO软碟通 v9.3.0.2612不带CDimage内核,曾用两软件制作N合1,前者压缩到了一个系统的大小,后者则是所有系统的大小...

    stb_image.h及相应cpp

    stb_image.h可用于opengl加载多种图片:.jpg .png等。这个最新版。最后修改2.27 (2021-07-11)。

    stb_image.h

    适用于opengl的单头文件图像加载库,使用于绝大部分格式,且方便易使用

    os.x.mavericks.10.9.retail.vmware.image.torrent

    os.x.mavericks.10.9.retail.vmware.image.torrent

    logsample.zip_log polar_log polar image_zip

    Log-polar image sampling

    canvas2image.js

    canvas2image.js 将canvas转化为image的js插件,可以将画布内容下载实现截图功能。

    txt1=new Image图片轮番.rar

    实现图片轮番,url1=new Image();url1.src='http://www.xxqs.com/'; txt1=new Image();txt1.txt='标题1'; img2=new Image();img2.src='/qs/edit/uploadfile/2008317225359787.jpg'; url2=new Image();url2.src='...

    log-transfer.zip_Log image

    logaritmic transfer of an image

    JS按照比例缩小图片

    var image=new Image(); var iwidth = 400; //定义允许图片宽度 var iheight =450; //定义允许图片高度 image.src=ImgD.src; if(image.width&gt;0 && image.height&gt;0){ flag=true; if(image.width/image.height&gt;= ...

    一键安装U盘GHOST 镜像"OSImage.gho"到C盘引导程序

    此引导程序默认搜索全盘查找名为"OSImage.gho"的镜像文件,不区分大小写,查找到后用引导程序内自带的GHOST11进行还原 引导程序内的批处理文件代码中保留了全盘搜索GHOST.EXE功能,若想全盘搜索GHOST并安装镜像,可以在...

    LoG-operator.zip_log_log operator_log matlab_matlab logImage_w

    matlab中关于LOG算子的源代码,用于图像的边缘提取,这个用着效果挺好。

    KVM安装与IMAGE制作过程及注意事项

    KVM安装与IMAGE制作过程及注意事项的详细介绍与举例。适合于KVM安装和IMAGE制作学习

Global site tag (gtag.js) - Google Analytics