public static function getLatestTitle($board) { if (!array_key_exists($board, self::$_latest_cache)) { self::$_latest_cache[$board] = TitleHistory::search(array('board' => $board))->max('time'); } return self::$_latest_cache[$board]; }
} $month_start = mktime(0, 0, 0, date('m', $min_time), 1, date('Y', $min_time)); $month_end = strtotime('+1 month', $month_start); $filename = 'ptthot-' . date('Ym', $month_start) . '.csv.gz'; $temp = tmpfile(); $meta_data = stream_get_meta_data($temp); $tmp_filename = $meta_data['uri']; $stream = gzopen($tmp_filename, 'w'); fwrite($stream, "#board,timestamp,count\n"); foreach (RankData::search("`time` >= {$month_start} AND `time` < {$month_end}")->order(array('board', 'time'))->volumemode(10000) as $rankdata) { $last_time = max($last_time, $rankdata->time); fwrite($stream, "{$rankdata->board},{$rankdata->time},{$rankdata->count}\n"); } fclose($stream); DropboxLib::putFile($tmp_filename, $filename); fclose($temp); KeyValue::set('snapshot_at', $last_time); } //dump titlehistory $filename = 'ptthot-title.csv.gz'; $temp = tmpfile(); $meta_data = stream_get_meta_data($temp); $tmp_filename = $meta_data['uri']; $stream = gzopen($tmp_filename, 'w'); fwrite($stream, "#board,timestamp,title\n"); foreach (TitleHistory::search(1)->order(array("board", "title"))->volumemode(10000) as $titlehistory) { fputcsv($stream, array($titlehistory->board, $titlehistory->time, $titlehistory->title)); } fclose($stream); DropboxLib::putFile($tmp_filename, $filename); fclose($temp);
curl_setopt($curl, CURLOPT_URL, 'http://www.ptt.cc/hotboard.html'); if (!($content = curl_exec($curl))) { exit; } $content = iconv('Big5', 'UTF-8//IGNORE', $content); $content = preg_replace('/([\\x{0fffe}-\\x{10ffff}]+)/u', '', $content); if (!preg_match('#\\(本文約每小時更新,最後更新時間 ([^)]*)#', $content, $matches)) { throw new Exception('找不到時間'); } if (!($time = strtotime($matches[1]))) { throw new Exception('找不到時間'); } $content = preg_replace('#<td[^>]*>#', '', $content); $content = preg_replace('#<a [^>]*>#', '', $content); $content = preg_replace('#</[^>]+>#', '', $content); preg_match_all("#人氣:([0-9]*)\n([^\\s]*)\n(.*)#m", $content, $matches); $latest_data = array(); foreach ($matches[0] as $id => $data) { try { $board = strval($matches[2][$id]); $count = intval($matches[1][$id]); $name = strval($matches[3][$id]); RankData::insert(array('time' => $time, 'board' => $board, 'count' => $count)); } catch (Pix_Table_DuplicateException $e) { RankData::search(array('time' => $time, 'board' => $board))->update(array('count' => $count)); } $latest_data[] = array($board, $count, $name); TitleHistory::updateTitle($board, $time, $name); } KeyValue::set('latest_hot', json_encode(array('time' => $time, 'boards' => $latest_data))); echo '完成: ' . date('c', $time) . "\n";