一段网站流量监测的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个回答

我抽空看了一下你的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

加载完tracker.php到tracker.php发送1.gif图片请求之间是有时间的,这段时间内用户可能离开网站,根据网站的类型,这个比率可大可小,这个需要你自己检测一下,当然30-50的百分比我确实认为大了点,我没办法看你的1.gif的具体请求信息,难道你不小心加了缓存头?

new Image().src = 'xxx';
这一段确实会发出请求,这是成名已久的日志发送方法,但正如我上文所说,这个Image对象可能碰巧不幸被GC回收,那这个请求就报废(abort)了
所以我给的代码中,先将Image对象挂在了window下,这样这个对象在对象图中就是可达的,不会被GC掉

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问