public static function getData($board, $period, $time) { if (0 == $period) { // year: format: YYYY, 一天一筆最高的 $max_time = mktime(0, 0, 0, 1, 1, $time + 1); $min_time = mktime(0, 0, 0, 1, 1, $time); } elseif (1 == $period) { // month: format: YYYYMM, 一天12筆 list($year, $month) = sscanf($time, "%4d%2d"); $min_time = mktime(0, 0, 0, $month, 1, $year); $max_time = strtotime('+1 month', $min_time); } elseif (3 == $period) { // daily: format: YYYYMMDD, 全部 list($year, $month, $day) = sscanf($time, "%4d%2d%2d"); $min_time = mktime(1, 1, 1, $month, $day, $year); $max_time = $min_time + 86400; } $last_update = RankData::search(array('board' => $board))->search("`time` < {$max_time}")->order("`time` DESC")->first()->time; if (!$last_update) { return array(); } if ($data = CacheData::search(array("board" => $board, "period" => $period, "time" => $time, "updated_at" => $last_update))->first()) { return json_decode($data->data); } if (0 == $period) { $datas = array(); for ($t = $min_time; $t < $max_time; $t += 86400) { $max_data = RankData::search(array('board' => $board))->search("`time` >= {$t} and `time` < {$t} + 86400")->max('count'); if (!$max_data) { continue; } $datas[] = array($max_data->time, $max_data->count); } } try { CacheData::insert(array('board' => $board, 'period' => $period, 'time' => $time, 'updated_at' => $last_update, 'data' => json_encode($datas, JSON_UNESCAPED_UNICODE))); } catch (Pix_Table_DuplicateException $e) { CacheData::search(array('board' => $board, 'period' => $period, 'time' => $time))->update(array('updated_at' => $last_update, 'data' => json_encode($datas, JSON_UNESCAPED_UNICODE))); } return $datas; }