public function dostatus()
{
// 获取最大ID
$sql = 'SELECT MAX(id) AS max_id FROM ' . C('DB_PREFIX') . 'online_logs WHERE statsed = 0';
$max_id = $this->odb->query($sql);
$max_id = @$max_id['0']['max_id'];
if (empty($max_id)) {
return false;
} else {
$sql = 'UPDATE ' . C('DB_PREFIX') . "online_logs SET statsed = 1 WHERE id < {$max_id}";
$this->odb->execute($sql);
}
// 开始统计
// TODO:需要计划任务支持移动上一日数据到备份表,现在在每次统计之后备份今天之前的数据到备份表
// 从logs累计总的用户数,总的游客数到stats表
$userDataSql = 'SELECT COUNT(1) AS pv, COUNT(DISTINCT uid) AS pu, COUNT(ip) AS guestpu, `day`, isGuest
FROM `' . C('DB_PREFIX') . "online_logs`\n\t\t\t\t\t\tWHERE id <= {$max_id}\n\t\t\t\t\t\tGROUP BY day, isGuest";
$userData = $this->odb->query($userDataSql);
if (!empty($userData)) {
$upData = array();
foreach ($userData as $v) {
if ($v['isGuest'] == 0) {
// 注册用户
$upData[$v['day']]['total_users'] = $v['pu'];
$upData[$v['day']]['total_pageviews'] += $v['pv'];
} else {
// 游客
$upData[$v['day']]['total_guests'] = $v['guestpu'];
$upData[$v['day']]['total_pageviews'] += $v['pv'];
}
}
foreach ($upData as $k => $v) {
$sql = 'SELECT id FROM ' . C('DB_PREFIX') . "online_stats WHERE day = '{$k}'";
$issetRow = $this->odb->query($sql);
if (empty($issetRow)) {
$sql = 'INSERT INTO ' . C('DB_PREFIX') . "online_stats (`day`,`total_users`,`total_guests`,`total_pageviews`) \n\t\t\t\t\t\t\t VALUES ('{$k}','{$v['total_users']}','{$v['total_guests']}','{$v['total_pageviews']}')";
} else {
$sql = ' UPDATE ' . C('DB_PREFIX') . "online_stats \n\t\t\t\t\t\t\t SET total_users = '{$v['total_users']}',\n\t\t\t\t\t\t\t total_guests = '{$v['total_guests']}',\n\t\t\t\t\t\t\t total_pageviews = {$v['total_pageviews']}\n\t\t\t\t\t\t\t WHERE day = '{$k}'";
}
$this->odb->execute($sql);
}
}
// 从online表统计在线用户到most_onine_user表
$this->checkOnline();
// 将logs表中今天之前的的数据移动到bak表
$sql = 'INSERT INTO ' . C('DB_PREFIX') . 'online_logs_bak SELECT * FROM `' . C('DB_PREFIX') . "online_logs` WHERE day <='" . date('Y-m-d', strtotime('-1 day')) . "'";
$this->odb->execute($sql);
// 删除logs表中今天之前的数据删除
$sql = ' DELETE FROM `' . C('DB_PREFIX') . "online_logs` WHERE day <='" . date('Y-m-d', strtotime('-1 day')) . "'";
// 统计结束
$this->odb->execute($sql);
}