PHP浏览次数统计类visit.class.php配合文本缓存
程序员文章站
2022-05-26 22:12:09
...
使用示例:
$visit = app::loader('visit');
$article_id = 20722;
$visit->count('article', $article);
$visit = app::loader('visit');
$article_id = 20722;
$visit->count('article', $article);
<?php class visit { public $expires = array(); public $tables = array(); public function __construct() { $this->expires['article'] = 10; $this->tables['article'] = 'pcb_article'; $this->expires['forum'] = 9; $this->tables['forum'] = 'pcb_forum'; $this->expires['blog'] = 8; $this->tables['blog'] = 'pcb_blog'; } public function count($channel, $id) { $path = $this->get_cache_path($channel); $this->update($path, $channel, $id); } private function get_cache_expires($channel) { $expires = isset($this->expires[$channel]) ? $this->expires[$channel] : 10; return $expires; } private function get_cache_path($channel) { $time = time(); $minute = date('H', $time) * 60 + date('i', $time); $expires = $this->get_cache_expires($channel); $path = SYS_PATH ."/data/cache/visit/{$channel}". ceil($minute / $expires) .".txt"; return $path; } private function update($path, $channel, $id) { $dir = dirname($path); if (!file_exists($dir)) make_dir($dir); if (file_exists($path)) { file_put_contents($path, ',' . $id, FILE_APPEND|LOCK_EX); } else { $table = $this->tables[$channel]; $mysql = app::loader('mysql'); $hand = opendir($dir); while (($file = readdir($hand))) { if (preg_match("/{$channel}/", $file)) { $visit = file_get_contents("{$dir}/{$file}"); $array = explode(',', $visit); $array = array_count_values($array); unset($array['']); $sql = ''; foreach ($array as $id => $visit) { $sql .="UPDATE `{$table}` SET `visit` = `visit` + {$visit} WHERE `id` = {$id} LIMIT 1;"; } if ($sql) { $res = $mysql->executes($sql); if ($res) unlink($dir . '/' . $file); } unset($sql); } } file_put_contents($path, ',' . $id, LOCK_EX); } } }