liltos 2011-03-28 21:36
浏览 590
已采纳

一段网站流量监测的JS代码

目前遇到一个非常棘手的问题,关于网站流量监测的,而我对如何解决完全没有想法。。
我的js代码地址:http://blog.blacklee.net/uploads/tech/tracker.php

首先简单说一下网站流量监测的基本思路吧
类似于 Google-Analytics ,需要先在被监测网站埋放一个 javascript ,像 ga.js 这样的
这段 js 自动加载执行,读取各个需要的数据,比如 document.referrer 、 cookies 等
然后往 document.body 上添加一个 img 节点,把需要的数据往 img src 的参数里放,向监测服务器发出一个类似的请求:
http://www.google-analytics.com/__utm.gif?utmwv=4.9.1&utmn=176820245&utmhn=www.douban.com&utmcs=UTF-8&utmsr=1440x900&utmsc=24-bit&utmul=zh-cn&utmje=1&utmfl=10.2%20r153&utmdt=%E8%B1%86%E7%93%A3&utmhid=278583876&utmr=-&utmp=%2F&utmac=UA-7019765-1&utmcc=__utma%3D30149280.276662128.1294996086.1300933211.1301276680.16%3B%2B__utmz%3D30149280.1300933211.15.6.utmcsr%3Dtwitter.com%7Cutmccn%3D(referral)%7Cutmcmd%3Dreferral%7Cutmcct%3D%2F%3B&utmu=qBM
后监测服务端分析WEB访问日志,计算数据

我现在的情况是,用了一个 php 生成 javascript:地址 http://blog.blacklee.net/uploads/tech/tracker.php
另此 js 和发出的图片 1.gif ,是位于同一台机器上的
结果是对 tracker.php 这个 js 的请求,总比对 1.gif 这个图片的请求多30%~50%
而预期应该是两者持平的:
[root@centos5 nginx]# grep '/tracker.php' access_2011-03-24.log | wc -l
  39660
[root@centos5 nginx]# grep '/1.gif' access_2011-03-24.log | wc -l
  22050

在 js 里面,我试过用 img 和 iframe 加载图片,效果一样。也试过把 1.gif 改成 __utm.gif ,效果还是一样。。。

困扰多日了,求教。
问题补充
请求图片的地址,每次的参数都不一样,不会有缓存
而且,就算有缓存,WEB服务器的日志里也应当有记录,状态码是304

js加载后自动执行的方法,我也试了直接执行和


if (window.addEventListener) {
window.addEventListener('load', work, false);
} else if (window.attachEvent) {
window.attachEvent('onload', work);
}

这里面的work也就是调用了一个init和submit,没做其它的。
效果没大差别

还有就是,同一网页也放了其它的第三方监测代码,量子统计、百度统计、孔明统计,他们的数据就还好了

另:如何大致检测未加载完成便离开的用户呢?
问题补充
恩,谢谢。
你提到的这几个说法我以前没遇过,长知识了。
回头试验一下你给出的代码~

PS:我这代码目前是放在网页最底部而不在head里

另外我和朋友还试验出了一种情况

var img = new Image();
img.src = "http://xxx";

只设置完img的src后,浏览器(IE8,FF)就去发送请求了。。。
@int08h,你觉得用这个来做手脚靠谱么?
  • 写回答

3条回答 默认 最新

  • weixin_42552673 2011-03-28 21:36
    关注

    我抽空看了一下你的tracker.php,发现这么些问题:
    1、javascript的Math.random是不接受seed的,所以Math.random(new Date())其实是没意义的,建议要随机串的话用(Math.random() * 100000).toFixed() + new Date()这样的形式
    2、你的img是放在document.body下的,你能保证用户不把tracker.php的引入script标签放在head吗?放在head的话,document.body会报Reference Error,导致1.gif没发送
    3、你的onload策略是用来解决document.body的Reference Error问题的,但是中国平均网页的onload时间是在5s以上,这个时间足够让大量用户离开网站了

    对于img标签的应用,我建议你这么写:
    [code="javascript"]
    var img = new Image(),
    id = 'img' + new Date();
    img.id = id;
    img.onload = img.onerror = img.onabort = function() { window[id] = undefined; };
    window[id] = img;
    img.src = 'http://xxx'; // 此处设置src
    [/code]
    以上代码需要注意的地方:
    1、img.src必须最后设定,不然onload/onerror/onabort可能没用,导致内存无法清理
    2、一定要挂到window下,不然如果页面的js执行非常频繁,导致GC很频繁的话,可能这个img的请求没完成的时候img对象被GC了,会导致请求被abort

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试