计算web访客的一个会话识别算法的php实现

QQ截图20140506173210

最近在做公司的BI系统,由于很多东西都是探索阶段,做起来遇到很多的问题,下面这个是其中一个计算一次访问会话的实现,还待优化和改进

/**
 * @param $data array(key=>array((int)view_time,url,referer)) order by value asc
 * @param $threshold
 * @param $delta
 * @return boolean
 */
function uvAlgorithm($data, $threshold, $delta) {
    $stack = array();
    $rangeDown = $data[0]['view_time'];
    $vid = md5($rangeDown);
    $rangeUp = $data[0]['view_time'] + $threshold;
//    echo $rangeDown . '~' . $rangeUp . "\n";
//    print_r($data);
    foreach ($data as $k=>$v) {
        if ($k == 0) {
            updateVisitId($v['id'], $vid);
            $stack[] = $v['url'];
            continue;
        }
        if ($v['view_time'] >= $rangeDown && $v['view_time'] < $rangeUp) {
            if (in_array($v['referer'], $stack) || ($data[$k]['view_time'] - $data[$k - 1]['view_time'] < $delta)) {
                $stack[] = $v['url'];
                updateVisitId($v['id'], $vid);
            }
            else {
                updateVisitId($v['id'], md5($v['view_time']));
            }

        }
        else {
            $temp = array_splice($data, $k);
//            print_r($temp);
//            print_r($data);
//            print_r($stack);
            $stack = array();
            if (empty($temp)) {
                return false;
            }
            else {
                uvAlgorithm($temp, $threshold, $delta);
            }
        }
    }
}