晓夏

北漂的女孩

Good Luck To You!

5秒处理5千万的数据

浏览量:431

<?php

// 统计结果集合
$list = array();
//打开文件  文件是5000多万的数据量,需要统计
$handle = fopen ("2016-06-07.txt", "r");

// 分析日志
while (!feof($handle)) {
    $buffer = rtrim(fgets($handle));
    if (empty($buffer)) {
        continue;
    }
    //数据格式 1377+13731d293a28d6424bf84561872ac1d4+tianjia+1465228800+1465266246 
    $a_info = explode('+', $buffer);  //截取数据
    //获取一个session开始时间和结束时间
    if (!isset($list[$a_info[0]][$a_info[1]]['start_time'])) {
        $list[$a_info[0]][$a_info[1]]['start_time'] = $a_info[4];
    }

    $list[$a_info[0]][$a_info[1]]['end_time'] = $a_info[4];
}
fclose ($handle);
echo "<pre>";
//统计在线时长,单位(分钟)
foreach ($list as $k => $user) {
    // 多个session,在线时间重叠,排重计算时间段
    $pre_user_k = null;
    $pre_session_info = null;
    foreach ($user as $uk => $session_info) {
        var_dump($session_info);
        var_dump($pre_session_info);
        if ($pre_session_info != null) {
            if (($session_info['start_time'] >= $pre_session_info['start_time']) && ($session_info['start_time'] <= $pre_session_info['end_time'])) {
                $user[$pre_user_k]['end_time'] = $session_info['end_time'];
                unset($user[$uk]);
                $pre_session_info = $user[$pre_user_k];
                continue;
            }
        }
        $pre_session_info = $session_info;
        $pre_user_k = $uk;
    }
    // 在线时长换算为分钟
    $online_seconds = 0;
    foreach ($user as $session_info) {
        $online_seconds += ($session_info['end_time'] - $session_info['start_time']);
    }
    $list[$k]['online_minute'] = ceil($online_seconds / 60);
    $online_seconds = 0;
}
file_put_contents('result.txt', json_encode($list));

记录客服操作的日志,并分析客服在线时长,直接处理文件太大,但是分割文件成小文件在存入数据库,数据量也太大,于是我想到不用mysql统计数据,直接用php操作文件处理完成,并记录文件

神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。